(function ($) {
    let $$ = Dom7, theme = 'auto', client = {};

    let JF = {};
    JF.LoadData = function (request, json, callback, url = '') {

        try {
            $.ajax({
                url: (url.length > 0 ? url : "core/php/index.php"),
                async: true,
                type: "POST",
                data: request,
                success: function (result) {
                    if (json !== null)
                        if (json)
                            result = JSON.parse(result);
                    if (callback !== null)
                        if (IsValidJSONString(result)) {
                            callback(result);
                        } else {
                            callback(JSON.parse("[{'error':'1','result':'" + result + "'}]"));
                        }
                }, error: function (xhr, textStatus, errorThrown) {
                    if (callback !== null)
                        callback(xhr);
                }
            });
        }
        catch (err) {
            console.log(err.message);
        }

        /**
         * @return {boolean}
         */
        function IsValidJSONString(data) {
            return true;
            //(/^[\],:{}\s]*$/.test(data.replace(/\\["\\\/bfnrtu]/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, '')));
        }
    };

    let CreditCard = function (input) {
        let oldValue,
            oldCursor,
            regex = new RegExp(/^\d{0,16}$/g),
            mask = function (value) {
                let output = [];
                for (let i = 0; i < value.length; i++) {
                    if (i !== 0 && i % 4 === 0) {
                        output.push("-"); // add the separator
                    }
                    output.push(value[i]);
                }
                return output.join("");
            },
            unmask = function (value) {
                // Remove every non-digit character
                return value.replace(new RegExp(/[^\d]/, 'g'), '');
            },
            checkSeparator = function (position, interval) {
                return Math.floor(position / (interval + 1));
            },
            keydownHandler = function (e) {
                let el = e.target;

                oldValue = el.value;
                oldCursor = el.selectionEnd;
            },
            inputHandler = function (e) {
                let el = e.target,
                    newCursorPosition,
                    newValue = unmask(el.value)
                ;

                if (newValue.match(regex)) {
                    newValue = mask(newValue);

                    newCursorPosition = oldCursor - checkSeparator(oldCursor, 4) + checkSeparator(oldCursor + (newValue.length - oldValue.length), 4) + (unmask(newValue).length - unmask(oldValue).length);

                    if (newValue !== "") {
                        el.value = newValue;
                    } else {
                        el.value = "";
                    }
                } else {
                    el.value = oldValue;
                    newCursorPosition = oldCursor;
                }
                el.setSelectionRange(newCursorPosition, newCursorPosition);
            };

        input.on('keydown', keydownHandler);
        input.on('input', inputHandler);
    };

    let error_validation = function (element, error) {
        app.popover.create({
            targetEl: element,
            backdrop: true,
            closeByOutsideClick: false,
            closeByBackdropClick: false,
            closeOnEscape: false,
            animate: true,
            content: '<div class="popover">' +
            '<div class="popover-inner">' +
            '<div class="block">' +
            '<p>' + error + '</p>' +
            '</div>' +
            '</div>' +
            '</div>',
            // Events
            on: {
                open: function (popover) {
                    setTimeout(function (e) {
                        popover.close();
                    }, 1500);
                },
                closed: function (popover) {
                    popover.destroy();
                }
            }
        }).open();

    };


    let submitData = function (formData) {
        app.dialog.preloader('منتظر بمانید.');
        // replace(/-/g, "")
        console.log(formData);
        JF.LoadData({
            request: 'proxy',
            action: 'WebServicesController',
            object: {
                GroupCode: 3131,
                CategoryCode: 220744,
                Mode: 1,
                RegFrom: -13,
                bnCode: formData['bus-card'],
                CardPan: formData['card'].replace(/-/g, ""),
                FirstName: formData['fName'],
                LastName: formData['lName'],
                FatherName: 'نام پدر',
                // IdNo: data['IdNo'],
                // BirthDate: data['BirthDate'],
                NationalCode: formData['nc'],
                Mobile: formData['mobile'],
                CardExpireDate: 1400
            },
            'data-header': 'NoCodeCustomerServiceNafis-app',
        }, true, function (e) {
            app.dialog.close();
            if (e.length === 1) {
                e = e[0];
                console.log(e.response);

                let error = {client: '', card: ''}, client = e.response.client, card = e.response.card;
                let job1 = false, job2 = false;
                if (client.hasOwnProperty('ResponseMessage') && client.ResponseMessage === '0000') {
                    error.client = 'مشخصات شما در شبکه نفیس ثبت شد.';
                    job1 = true;
                } else {
                    job1 = false;
                    error.client = 'ثبت نام شما با خطا مواجه شد.';
                    error.client += "<br>";
                    error.client += client.ResponseMessage;
                }

                if (card.hasOwnProperty('ResponseMessage') && card.ResponseMessage === '0000') {
                    job2 = true;
                    error.card = 'کارت شما به شبکه نفیس اضافه شد.';
                } else {
                    job2 = false;
                    error.card = 'ثبت کارت شما با خطا مواجه شد.';
                    error.card += "<br>";
                    error.card += client.ResponseMessage;
                }
                setTimeout(function () {
                    if (job1 && job2) {
                        app.dialog.alert(error.client, 'کاشان کارت');
                    } else if (job1 && !job2) {
                        app.dialog.alert(error.client, 'کاشان کارت', function () {
                            app.dialog.alert(error.card, 'خطا');
                        });
                    } else if (!job1 && job2) {
                        app.dialog.alert(error.client, 'کاشان کارت');
                    } else {
                        app.dialog.alert('سرویس در حال بروز رسانی میباشد.', 'خطا');
                    }
                }, 500);
            } else {
                app.dialog.alert('سرویس در حال بروز رسانی میباشد.');
            }
        }, '../ResourcesHolder/core/index.php');
    };

    let validation = function (formData, callback) {
        let createError = function (error, element) {
            return {error: error, element: $("input[name=" + element + "]")}
        };
        if (formData.fName.length > 2) {
            if (formData.lName.length > 2) {
                if (formData.nc.length === 10) {
                    let validate = true;
                    for (let i = 0; i < 10; i += 1) {
                        let char = formData.nc[i];
                        if (isNaN(parseInt(char))) {
                            validate = false;
                            break;
                        }
                    }
                    if (validate) {
                        if (formData['bus-card'].length === 12) {
                            if (formData.card.replace(/-/g, "").length === 16) {
                                if (formData.mobile.length === 10) {
                                    validate = true;
                                    for (let i = 0; i < 10; i += 1) {
                                        let char = formData.mobile[i];
                                        if (isNaN(parseInt(char))) validate = false;
                                    }
                                    if (validate) {
                                        callback(true, {error: '', element: ''}, formData);
                                    } else {
                                        callback(false, createError('فقط عدد وارد کنید.', 'mobile'), formData);
                                    }
                                } else {
                                    callback(false, createError('شماره مبایل خود را وارد کنید.', 'mobile'), formData);
                                }
                            } else {
                                callback(false, createError('شماره کارت خود را وارد کنید.', 'card'), formData);
                            }
                        } else {
                            callback(false, createError('شماره کاشان کارت خود را وارد کنید', 'bus-card'), formData);
                        }
                    } else {
                        callback(false, createError('فقط عدد وارد کنید.', 'nc'), formData);
                    }
                } else {
                    callback(false, createError('کد ملی را وارد کنید.', 'nc'), formData);
                }
            } else {
                callback(false, createError('نام خانوادگی را وارد کنید', 'lName'), formData);
            }
        } else {
            callback(false, createError('نام را وارد کنید.', 'fName'), formData);
        }
    };

    if (document.location.search.indexOf('theme=') >= 0) {
        theme = document.location.search.split('theme=')[1].split('&')[0];
    }

    let app = new Framework7({
        id: 'com.android.kashan.card',
        root: '#app',
        theme: theme,

        dialog: {
            // set default title for all dialog shortcuts
            // change default "OK" button text
            buttonOk: 'خب',
            buttonCancel: 'نه',
        },
        input: {
            scrollIntoViewOnFocus: true,
            scrollIntoViewCentered: true,
        }
    });


    app.dialog.preloader('منتظر بمانید.');
    $('div.card.lazy-fade-in').fadeIn(1000, function () {
        app.dialog.close();
    });

    CreditCard($("input[name=card]"));

    // let obj = {
    //     'bus-card': "asdad3123213",
    //     card: "2222-2222-2222-2223",
    //     fName: "2222222",
    //     lName: "22222323",
    //     mobile: "9367153842",
    //     nc: "0017904791"
    // };
    // app.form.fillFromData('#register-nafis', obj);

    $$('.get-data').on('click', function () {
        let formData = app.form.convertToData('#register-nafis');
        validation(formData, function (state, {error, element}, data) {
            if (!state) error_validation(element, error);
            else submitData(data);
        });
    });


}(jQuery));