/**
 * Created by ncrowley on 4/6/17.
 */

var bpUtilities  = {

    /**
     * @NOTE  if persistUntilClose is enabled, Tooltip must be reinitialized on obj after tooltip is closed.
     * @param elem
     * @param message
     * @param persistUntilClose
     * @param destroyOnMouseLeave
     */
    addToolTiptoElement : function(elem, message,persistUntilClose, destroyOnMouseLeave) {
        var $elem = $(elem);
        persistUntilClose = typeof persistUntilClose == 'undefined' ? false : persistUntilClose;
        destroyOnMouseLeave = typeof destroyOnMouseLeave == 'undefined' ? false : destroyOnMouseLeave;

        $($elem).on('mouseout focusout', function(event) {
            if(persistUntilClose){
                event.stopImmediatePropagation();
            }
            else if (destroyOnMouseLeave) {
                $($elem).tooltip("destroy")
            }
        });

        $($elem).tooltip({
            title: persistUntilClose && destroyOnMouseLeave ? '<span style="top:0;right:0;" class="tooltipClose fa fa-close pull-right"></span>' + "<h5>"+ message +"</h5>" : "<h5>"+ message +"</h5>",
            open: function (event, ui) {
                var $element = $(event.target);
                ui.tooltip.click(function () {
                    $element.tooltip('close');
                });
            },
            html: true
        });
        $($elem).tooltip("show");

        $(".tooltipClose").click(function(){
            $($elem).tooltip("destroy");
        });
    },


    /**
     * attempts to find a property in a given JS object by key regardless of depth in object.
     *
     * @param obj
     * @param key
     * @param out
     * @returns {*}
     */
    findProp : function(obj, key, out) {
        var i,
            proto = Object.prototype,
            ts = proto.toString,
            hasOwn = proto.hasOwnProperty.bind(obj);

        if ('[object Array]' !== ts.call(out)) out = [];

        for (i in obj) {
            if (hasOwn(i)) {
                if (i === key) {
                    out.push(obj[i]);
                } else if ('[object Array]' === ts.call(obj[i]) || '[object Object]' === ts.call(obj[i])) {
                    bpUtilities.findProp(obj[i], key, out);
                }
            }
        }

        return out;
    },

    /**
     * sorts an object by its keys.
     *
     * @param obj
     * @returns {{}}
     */
    sortObjByKeys : function(obj){
        var orderedRes = {};
        Object.keys(obj).sort().forEach(function(key) {
            orderedRes[key] = obj[key];
        });

        return orderedRes;
    },

    /**
     * Returns a registration age for a registration date
     *
     * @param registrationDate
     * @returns {string}
     */
    getRegistrationAge : function(registrationDate) {
        if(!registrationDate)
        {
            return "";
        }
        registrationDate = new Date(registrationDate);
        if(registrationDate < new Date("09/01/2001").getTime())
        {
            return "";
        }

        var lateYearCounter = 51;

        var year = 2001;
        var regAge = null;
        for(var i = 1; i <=50; i++)
        {
            var march1st = new Date('03/01/' + year);
            var aug31 = new Date('08/31/' + year);

            var sept1 = new Date('09/01/' + year);
            var leapYearDays = new Date(year, 2, 0).getDate();
            var febEnd = new Date('02/' + leapYearDays  + '/' + (year + 1));

            if(registrationDate <= aug31 && registrationDate >= march1st)
            {
                regAge = i;
                break;
            }

            if(registrationDate <= febEnd && registrationDate >= sept1)
            {
                regAge = lateYearCounter;
                break;
            }

            lateYearCounter++;
            year++;
        }

        regAge = regAge < 10 ? "0" + regAge : regAge;

        return  regAge + " " + registrationDate.getFullYear();
    },

    getMonthlyPaymentNumbersForPaymenntCalculatorFromVehicleOject : function(vehicleData){

        if( !bpUtilities.getMonthlyPaymentNumbersForPaymenntCalculatorFromVehicleOject.rules )
        {
            $.ajax({
                url:rootloc+'data/paymentCalculatorMonthlyPaymentDefaults.json',
                dataType : 'json',
                async : false,
                success : function(data) {
                    bpUtilities.getMonthlyPaymentNumbersForPaymenntCalculatorFromVehicleOject.rules = data
                }});
        }

        var compareFields = { 'vin':8, 'trim':7, 'model':6, 'make':5, 'year':4, 'condition':3, 'bodyStyle':2, 'all':1 };
        var winningScore = 0;
        var winningRules = {};

        $(bpUtilities.getMonthlyPaymentNumbersForPaymenntCalculatorFromVehicleOject.rules).each(function()
        {
            var entry = this;
            var thisScore = 0;

            $(entry.conditions).each( function(){

                if( this.field )
                {
                    if( this.value.trim().toLowerCase() != vehicleData[this.field].trim().toLowerCase() )
                    {
                        thisScore = 0;
                        return false;
                    }

                    if( parseInt(compareFields[this.field]) > thisScore )
                    {
                        thisScore = parseInt(compareFields[this.field]);
                    }
                }
            });

            if( thisScore > winningScore )
            {
                winningScore = thisScore;
                winningRules = entry.numbers;
            }

        });

        return winningRules;
    }
};