package org.okip.okifunc.dictionary.impl;

public class ResourceDictionaryManager
{    
    public ResourceDictionaryManager()
    {
    }
    
    public void processCommandLine(String args[])
    {
        org.okip.okifunc.dictionary.api.Factory factory = new org.okip.okifunc.dictionary.impl.Factory();
        org.okip.okifunc.dictionary.api.ResourceDictionary dictionary = factory.createResourceDictionary();
        
        try
        {
            dictionary.load();
            
            String tag = null;
            String language = "en";
            String country = "US";
            String filename = "org/okip/okifunc/dictionary/impl/mit.dictionary";
            String localization = null;
            String action = null;
            boolean includeReversi = false;
            boolean noLocale = true;
            boolean argsFailed = false;
        
            int argsCount = args.length;
            if (argsCount == 0)
            {
                argsFailed = true;
            }
            else
            {
//		  disable as we don't currently serialize language and filename
//                java.util.Locale currentDefaultLocale = dictionary.getDefaultLocale();
//                language = currentDefaultLocale.getLanguage();
//                country = currentDefaultLocale.getCountry();
//		  filename = dictionary.getDictionaryFilename();
                
                try
                {
                    if ( (!args[0].equals("-a")) && (!args[0].equals("-r")) && (!args[0].equals("-c")) && 
                         (!args[0].equals("-g")) && (!args[0].equals("-d")) && (!args[0].equals("-s")) )
                    {
                        argsFailed = true;
                    }
                    else
                    {
                        if (args[0].equals("-a")) action = "add";
                        else if (args[0].equals("-r")) action = "remove";
                        else if (args[0].equals("-c")) action = "contains";
                        else if (args[0].equals("-g")) action = "get";
                        else if (args[0].equals("-d")) action = "dump";
//                        else if (args[0].equals("-s")) action = "setDefaultLocale";
                    }
                    
                    for (int i=1; i < argsCount; i++)
                    {
                        if (args[i].equals("-t")) tag = args[++i];
                        else if (args[i].equals("-l")) localization = args[++i];
                        else if (args[i].equals("-e")) { language = args[++i]; noLocale = false; }
                        else if (args[i].equals("-y")) { country = args[++i]; noLocale = false; }
                        else if (args[i].equals("-f")) filename = args[++i];
                        else if (args[i].equals("-i")) includeReversi = true;
                    }
                }
                catch (ArrayIndexOutOfBoundsException a)
                {
                    argsFailed = true;
                }
            }
        
            if (!argsFailed)
            {
                
                if (filename != null) dictionary.setDictionaryFilename(filename);
                java.util.Locale locale = new java.util.Locale(language,country);
                java.util.Locale reversiLocale = new java.util.Locale("reversi","US");
                String key = tag;
/*
System.out.println("action " + action);
System.out.println("tag " + tag);
System.out.println("localization " + localization);
System.out.println("language " + language);
System.out.println("country " + country);
System.out.println("locale " + locale);
System.out.println("filename " + filename);
System.out.println("reversi? " + includeReversi);
System.out.println("default locale? " + noLocale);
*/
                if (action.equals("add"))
                {
                    if ((localization == null) || (tag == null)) 
                    {
                        argsFailed = true;
                    }
                    else
                    {
                        dictionary.addResource(key,locale,localization);
                        if (includeReversi) dictionary.addResource(key,reversiLocale,reverse(localization));
                        dictionary.store();
                        System.out.println("localization " + localization + " for tag " + tag + " added");
                    }
                }
                else if(action.equals("remove"))
                {
                    if (tag == null)
                    {
                        argsFailed = true;
                    }
                    else
                    {	
                        dictionary.removeResource(key,locale);
                        if (includeReversi) dictionary.removeResource(key,reversiLocale);
                        dictionary.store();
                        System.out.println("localizations for tag " + tag + " removed");
                    }
                }
                else if(action.equals("contains"))
                {
                    if (tag == null)
                    {
                        argsFailed = true;
                    }
                    else
                    {
                        System.out.println("contains " + tag + " in " + locale + dictionary.containsResource(key,locale));
                        if (includeReversi) 
                        {
                            System.out.println("contains " + tag + " in " + 
                                reversiLocale + dictionary.containsResource(key,reversiLocale));
                        }
                    }
                }
                else if(action.equals("get"))
                {
                    if (tag == null)
                    {
                        argsFailed = true;
                    }
                    else
                    {
                        System.out.println(tag + " in " + locale + " is " + dictionary.getResource(key,locale));
                        if (includeReversi) 
                        {
                            System.out.println(tag + " in " + locale + " is " + dictionary.getResource(key,locale));
                        }
                    }
                }
                else if(action.equals("dump"))
                {
                    Object tags[];
                    Object localizations[];
                    int j;
                    if (noLocale)
                    {
                        localizations = dictionary.getAllResources();
                        tags = dictionary.getAllResourceTags();
                        for (j=0; j < localizations.length; j++)
                        {
                            System.out.println(tags[j] + " is " + localizations[j]);
                        }
                    }
                    else
                    {
                        localizations = dictionary.getAllResourcesForLocale(locale);
                        tags = dictionary.getAllResourceTagsForLocale(locale);
                        for (j=0; j < localizations.length; j++)
                        {
                            System.out.println(tags[j] + " is " + localizations[j]);
                        }
                        if (includeReversi)
                        {
                            localizations = dictionary.getAllResourcesForLocale(reversiLocale);
                            tags = dictionary.getAllResourceTagsForLocale(reversiLocale);
                            for (j=0; j < localizations.length; j++)
                            {
                                System.out.println(tags[j] + " is " + localizations[j]);
                            }
                        }
                    }
                }
/*
                else if(action.equals("setDefaultLocale"))
                {
                    if (noLocale)
                    {
                        argsFailed = true;
                    }
                    else
                    {
                        java.util.Locale oldLocale = dictionary.getDefaultLocale();
                        java.util.Locale newLocale = new java.util.Locale(language,country);
                        dictionary.setDefaultLocale(newLocale);
                        System.out.println("Dictionary's default locale changed from " + oldLocale + " to " + newLocale);
                        dictionary.store();
                    }
                }
*/
            }
            
            if (argsFailed)
            {        
                System.out.println(" Usage: ");
                System.out.println(" ResourceDictionaryManager resource [-{arcgd}] [-t tag] [-l localization] [-e language] [-y country] [-f filename] [-i]"); 
//                System.out.println(" ResourceDictionaryManager resource [-{arcgds}] [-t tag] [-l localization] [-e language] [-y country] [-f filename] [-i]"); 
                System.out.println();
                System.out.println(" -a	add localization for tag (requires value argument) ");
                System.out.println(" -r	remove localization for tag ");
                System.out.println(" -c	contains localizaton for tag ");
                System.out.println(" -g	get localization for tag ");
                System.out.println(" -d	get localization for all tags (if language and country specified, get only those) ");
//                System.out.println(" -s	set default locale (language (-e), country (-y), or both must be specified) ");
                System.out.println(" -t	tag ");
                System.out.println(" -l	localization ");
                System.out.println(" -e	specify local with language (if nothing specified, uses en) ");
                System.out.println(" -y	specify local with country (if nothing specified, uses US) ");
                System.out.println(" -f	specify dictionary filename (if nothing specified, uses org/okip/okifunc/dictionary/impl/mit.dictionary) ");
                System.out.println(" -i	indicates that any Reversi entry should be included as well ");
                System.exit(1);
            }	
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
    
    private String reverse(String in)
    {
        String out = "";
        for (int i = in.length(); i > 0; i--) out = out + in.substring(i-1,i);
        return out;
    }

    public static void main(String args[])
    {
        ResourceDictionaryManager rdm = new ResourceDictionaryManager();
        rdm.processCommandLine(args);
        System.exit(0);
    }
}