/*
 *
 * Copyright 2013 Canonical 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.
 *
*/
var exec = require('cordova/exec');
var argscheck = require('cordova/argscheck');
var GlobalizationError = require('./GlobalizationError');

function convertStringToDateOptions(override) {
    var options = { formatLength: 'short', selector: 'date and time' };

    if (override) {
        for (var key in options) {
            if (!options.hasOwnProperty(key))
                continue;
            if (typeof(options[key]) !== typeof(override[key]))
                continue;
            options[key] = override[key];
        }
    }
    var formats = ["short", "medium", "long", "full"];
    var selectors = ["date", "time", "date and time"];

    options.formatLength = formats.indexOf(options.formatLength);
    options.selector = selectors.indexOf(options.selector);
    //TODO: throw error
    if (options.formatLength === -1)
        options.formatLength = 0;
    if (options.selector === -1)
        options.selector = 0;

    return options;
}

function convertStringToNumberOptions(override) {
    var options = { type: 'decimal' };
    //TODO: make function
    if (override) {
        for (var key in options) {
            if (!options.hasOwnProperty(key))
                continue;
            if (typeof(options[key]) !== typeof(override[key]))
                continue;
            options[key] = override[key];
        }
    }

    var types = [ 'decimal', 'percent', 'currency' ];
    options.type = types.indexOf(options.type);
    if (options.type === -1)
        options.type = 0;

    return options;
}

function isInt(n) {
   return n % 1 === 0;
}

module.exports = {
    isDayLightSavingsTime: function(date, successCB, failureCB) {
        argscheck.checkArgs('dfF', 'Globalization.isDayLightSavingsTime', arguments);

        exec(successCB, failureCB, "Globalization", "isDayLightSavingsTime", [ { time_t: date.getTime() } ]);
    },

    dateToString: function(date, successCB, failureCB, override) {
        argscheck.checkArgs('dfFO', 'Globalization.dateToString', arguments);

        var options = convertStringToDateOptions(override);
        exec(successCB, failureCB, "Globalization", "dateToString",
             [ { time_t: date.getTime(), formatLength: options.formatLength, selector: options.selector } ]);

    },

    stringToDate: function(dateString, successCB, failureCB, override) {
        argscheck.checkArgs('sfFO', 'Globalization.stringToDate', arguments);

        var options = convertStringToDateOptions(override);
        exec(successCB, failureCB, "Globalization", "stringToDate",
             [ { dateString: dateString, formatLength: options.formatLength, selector: options.selector } ]);
    },

    getDateNames: function(successCB, failureCB, override) {
        argscheck.checkArgs('fFO', 'Globalization.getDateNames', arguments);

        var options = { type: 'wide', item: 'months' };

        if (override) {
            for (var key in options) {
                if (!options.hasOwnProperty(key))
                    continue;
                if (typeof(options[key]) !== typeof(override[key]))
                    continue;
                options[key] = override[key];
            }
        }

        var requests = ["days", "months"];
        var formats = ["narrow", "wide"];

        options.item = requests.indexOf(options.item);
        options.type = formats.indexOf(options.type);

        //TODO: throw error
        if (options.item === -1)
            options.item = 0;
        if (options.type === -1)
            options.type = 0;

        exec(successCB, failureCB, "Globalization", "getDateNames", [ options ]);
    },

    numberToString: function(number, successCB, failureCB, override) {
        argscheck.checkArgs('nfFO', 'Globalization.numberToString', arguments);

        var options = convertStringToNumberOptions(override);

        exec(successCB, failureCB, "Globalization", "numberToString",
             [ { type: options.type, isInt: isInt(number), number: number } ]);
    },

    stringToNumber: function(numberString, successCB, failureCB, override) {
        argscheck.checkArgs('sfFO', 'Globalization.stringToNumber', arguments);

        var options = convertStringToNumberOptions(override);
        exec(successCB, failureCB, "Globalization", "stringToNumber", [ options.type, numberString ]);
    },

    getDatePattern: function(successCB, failureCB, override) {
        argscheck.checkArgs('fFO', 'Globalization.getDatePattern', arguments);

        var options = convertStringToDateOptions(override);
        exec(successCB, failureCB, "Globalization", "getDatePattern", [ options.formatLength, options.selector ]);
    },

    getNumberPattern: function (successCB, failureCB, override) {
        argscheck.checkArgs('fFO', 'getNumberPattern', arguments);

        var options = convertStringToNumberOptions(override);
        Cordova.exec(successCB, failureCB, "Globalization", "getNumberPattern", [ options.type ]);
    },

    getCurrencyPattern: function(currencyCode, successCB, failureCB) {
        argscheck.checkArgs('sfF', 'Globalization.getCurrencyPattern', arguments);

        failureCB(new GlobalizationError(GlobalizationError.PATTERN_ERROR, "unimplemented"))
        //exec(successCB, failureCB, "Globalization", "getCurrencyPattern", [{"currencyCode": currencyCode}]);
    }
};

require("cordova/exec/proxy").add("navigator.globalization", module.exports);
