/*
 * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
 *
 * Copyright @ 2015 Atlassian Pty Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.java.sip.communicator.plugin.thunderbird;

import java.util.*;

import net.java.sip.communicator.service.contactsource.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;

import org.jitsi.service.configuration.*;
import org.jitsi.service.resources.*;
import org.osgi.framework.*;

/**
 * Bundle-Activator for the Thunderbird address book contact source plug-in.
 *
 * @author Ingo Bauersachs
 */
public class ThunderbirdActivator
    implements BundleActivator
{
    /** OSGi context. */
    private static BundleContext bundleContext;

    /** Active address book registrations. */
    private static Map<ThunderbirdContactSourceService, ServiceRegistration>
        registrations;

    /**
     * The registered PhoneNumberI18nService.
     */
    private static PhoneNumberI18nService phoneNumberI18nService;

    /**
     * Gets the configuration service.
     * @return the configuration service.
     */
    static ConfigurationService getConfigService()
    {
        return ServiceUtils.getService(bundleContext,
            ConfigurationService.class);
    }

    /**
     * Gets the resource service.
     * @return the resource service.
     */
    static ResourceManagementService getResources()
    {
        return ServiceUtils.getService(bundleContext,
            ResourceManagementService.class);
    }

    /**
     * Gets all registered Thunderbird address book services.
     * @return all registered Thunderbird address book services.
     */
    static List<ThunderbirdContactSourceService> getActiveServices()
    {
        return new LinkedList<ThunderbirdContactSourceService>(
            registrations.keySet());
    }

    /**
     * Loads and registers an address book service.
     * @param config the name of the base property of the service to load.
     */
    static void add(String config)
    {
        ThunderbirdContactSourceService service
            = new ThunderbirdContactSourceService(config);
        registrations.put(service,
            bundleContext.registerService(
                ContactSourceService.class.getName(), service, null));
    }

    /**
     * Stops an address book service and deletes the corresponding configuration
     * data.
     *
     * @param service the address book instance to remove.
     */
    static void remove(ThunderbirdContactSourceService service)
    {
        registrations.get(service).unregister();
        registrations.remove(service);
        ConfigurationService config = getConfigService();
        config.removeProperty(service.getBaseConfigProperty());
        for (String prop : config.getPropertyNamesByPrefix(
            service.getBaseConfigProperty(), false))
        {
            config.removeProperty(prop);
        }
    }

    /**
     * Searches the configuration for Thunderbird address books and registers a
     * {@link ContactSourceService} for each found config.
     */
    public void start(BundleContext bundleContext) throws Exception
    {
        ThunderbirdActivator.bundleContext = bundleContext;

        ConfigurationService config = getConfigService();
        List<String> configs =
            config.getPropertyNamesByPrefix(
                ThunderbirdContactSourceService.PNAME_BASE_THUNDERBIRD_CONFIG,
                false);

        registrations = new HashMap
            <ThunderbirdContactSourceService, ServiceRegistration>();
        for (String cfg : configs)
        {
            String value = config.getString(cfg);
            if (value != null && cfg.endsWith(value))
            {
                add(cfg);
            }
        }

        /* registers the configuration form */
        Dictionary<String, String> properties
            = new Hashtable<String, String>();
        properties.put(
            ConfigurationForm.FORM_TYPE,
            ConfigurationForm.CONTACT_SOURCE_TYPE);

        bundleContext.registerService(
            ConfigurationForm.class.getName(),
            new LazyConfigurationForm(
                ThunderbirdConfigForm.class.getName(),
                getClass().getClassLoader(),
                null,
                "plugin.thunderbird.CONFIG_FORM_TITLE"),
            properties);
    }

    /**
     * Unregisters all {@link ContactSourceService}s that were registered by
     * this activator.
     */
    public void stop(BundleContext bundleContext) throws Exception
    {
        for (ServiceRegistration sr : registrations.values())
        {
            sr.unregister();
        }

        registrations = null;
    }

    /**
     * Returns the PhoneNumberI18nService.
     * @return returns the PhoneNumberI18nService.
     */
    public static PhoneNumberI18nService getPhoneNumberI18nService()
    {
        if(phoneNumberI18nService == null)
        {
            phoneNumberI18nService = ServiceUtils.getService(
                bundleContext,
                PhoneNumberI18nService.class);
        }

        return phoneNumberI18nService;
    }
}
