/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * 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 com.motorola.studio.android.devices.services.lang.model;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.FileLocator;

import com.motorola.studio.android.common.log.StudioLogger;
import com.motorola.studio.android.devices.services.DeviceServicesPlugin;

/**
 * Language representation
 * 
 * The list of languages has been downloaded from:
 * http://www.loc.gov/standards/iso639-2/ascii_8bits.html
 */
public class Language
{

    private static final String FILE_PATH = "resources/ISO-639-2_utf-8.txt";

    private static List<Language> languageList = null;

    private static Map<String, Language> languageMap = null;

    private String name;

    private String id;

    /**
     * Get the languages list
     * 
     * @return the languages list
     */
    public static List<Language> getLanguageList()
    {
        if (languageList == null)
        {
            loadLanguages();
        }
        return languageList;
    }

    /**
     * Load languages from TXT file
     */
    private static void loadLanguages()
    {
        languageList = new ArrayList<Language>();
        languageMap = new HashMap<String, Language>();

        URL languagesURL = DeviceServicesPlugin.getDefault().getBundle().getResource(FILE_PATH);

        BufferedReader input = null;
        try
        {

            File file = new File(FileLocator.toFileURL(languagesURL).getPath());

            input = new BufferedReader(new FileReader(file));

            String line = null;
            String[] lineParts = null;
            String name = null;
            String ID = null;
            while ((line = input.readLine()) != null)
            {
                lineParts = line.split("\\|");
                ID = lineParts[2];
                name = lineParts[3];
                if (((ID != null) && (!ID.equals(""))) && ((name != null) && (!name.equals(""))))
                {
                    Language language = new Language(name, ID);
                    languageList.add(language);
                    languageMap.put(name, language);
                }
            }
        }
        catch (Exception e)
        {
            StudioLogger.error("Change Language TmL Service: could not load languages list");
        }
        finally
        {
            if (input != null)
            {
                try
                {
                    input.close();
                }
                catch (IOException e)
                {
                }
            }
        }

    }

    /**
     * Get language ID from language name
     * 
     * @param langName language name
     * @return language ID
     */
    public static String getIdFromName(String langName)
    {
        String id = null;
        Language language = languageMap.get(langName);
        if (language != null)
        {
            id = language.getId();
        }
        return id;
    }

    /**
     * Constructs a new Language instance, based on the given name and id.
     * @param name language name
     * @param id language id
     */
    public Language(String name, String id)
    {
        super();
        this.name = name;
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getId()
    {
        return id;
    }

    public void setId(String id)
    {
        this.id = id;
    }

}
