(function () {
    if ((typeof jQuery191 === 'undefined')) {
        if (window.jQuery) {
            jQuery191 = window.jQuery;
        } else if (window.Checkout && window.Checkout.$) {
            jQuery191 = window.Checkout.$;
        }
    }
})();

function getHost() {
    const scripts = document.getElementsByTagName('script');
    let scriptUrl = '';

    for (let i = 0; i < scripts.length; i++) {
        if (scripts[i].src.includes('shopify/dataClient.js')) {
            scriptUrl = scripts[i].src;
            break;
        }
    }
    return new URL(scriptUrl).origin;
}

function searchOrder() {
    $ = jQuery191;

    var order = new Object();
    var name = $("#orderNumber").val();
    var total = $("#total").val();

    order.ShopName = Shopify.shop;
    order.OrderId = name;
    order.OrdenName = total;


    var host = getHost();

    $("#status").show();
    $.ajax({
        url: host + '/Shopify/Clients/SearchOrder',
        type: 'GET',
        async: false,
        dataType: 'jsonp',
        data: { info: btoa(JSON.stringify(order)) },
        success: function (result) {
            $("#status").hide();
            if (result.success == true)
                getBilling(result.shop, result.orderId);
            else
                alert("No se encontró la orden de compra a facturar, revisa que los datos sean los correctos.");
        },
        error: function () {
            alert("Ocurrio un error al procesar la peticion.");
            $("#status").hide();
        },
    });
}

function getBilling(shop, id) {
    $ = jQuery191;

    var host = getHost();

    $("#status").show();
    $.ajax({
        url: host + '/Shopify/Clients/getBillingPartial',
        type: 'GET',
        async: false,
        dataType: 'jsonp',
        data: { shop: shop, orderId: id},
        success: function (result) {
            var html = result.partial;
            html += '<b style="font-size: small;">La version del CFDI es ' + result.version + ' , los datos de Régimen Fiscal y CP es para actualizar el catalogo de clientes.</b>';

            $("#containerFacturama").empty().append(html);//result.partial);
            if ($("#Rfc").val() != undefined && $("#Rfc").val() != "")
                $("#Rfc").trigger('onkeyup');
            $("#status").hide();
        },
        error: function () {
            alert("Ocurrio un error al procesar la peticion.");
            $("#status").hide();
        },
    });
}

function saveClient(isStore) {
    $ = jQuery191;
    var error = ValidateClient();
    if (error == "") {
        var client = btoa(JSON.stringify(getDataClient()));
        var checkout = btoa(JSON.stringify(getCheckOutElements(isStore)));
        if (client != null && checkout != null) {
            submitClient(client, checkout, isStore);
        } else
            $("#errors").empty().append("Ocurrio un error al obtener la informacion.");
    } else {
        $("#errors").empty().append(error);
    }
}

function submitClient(client, checkout, isStore) {
    $ = jQuery191;
    var host = getHost();

    $("#status").show();
    $.ajax({
        url: host + '/Shopify/Clients/SaveClient',
        type: 'GET',
        async: false,
        dataType: 'jsonp',
        data: { dataClient: client, checkout: checkout },
        success: function (result) {
            $("#errors").empty();
            if (result.onlyData == true) {
                alert("Se guardo correctamente la información, pongase en contacto con el encargado de la Tienda.");
                $("#status").hide();
            } else if (result.success == true && result.shopInvoiceId > 0 && result.created == false && result.createdByLimit != false) {
                if (result.orderStatus) {
                    alert("Se guardo correctamente la información, espera un momento en lo que se genera la Factura.");

                    if (result.version == null || result.version == undefined || result.version == "") {
                        alert("Versión no válida para la generación de comprobantes");
                        $("#status").hide();
                    }else if (isStore == false) {
                        createCfdi($("[name=ShopName]").val(), result.shopInvoiceId, result.creditNoteId, result.version);
                    } else {
                        createCfdi(Shopify.shop, result.shopInvoiceId, result.creditNoteId, result.version);
                    }
                } else {
                    alert("Se guardo correctamente la información. La orden se encuentra pendiente de pago, en cuanto se vea reflejado el pago se generará la Factura.");
                    $("#status").hide();
                }
            } else if (result.success == true && result.shopInvoiceId > 0 && result.created == false && result.createdByLimit == false) {
                alert("Se guardo correctamente la información, pero ya se terminó el tiempo para generar la factura, ponte en contacto con el Vendedor.");
                $("#status").hide();
            }else if (result.success == true && result.shopInvoiceId > 0 && result.created == true) {
                alert("Se guardaron los datos de Facturación, pero ya existe una factura para esta compra, contacta al vendedor en caso de que necesites se te refacture.");
                $("#status").hide();
            } else {
                if (result.success == false && result.errors != null) {//&& obj.partialCertif != ""
                    for (var i = 0; i < result.errors.length; i++) {
                        console.log(result.errors[i]);
                        $("#errors").append(result.errors[i]).append("<br/>");
                    }
                }
                alert("Fallo al guardar la información.");
                $("#status").hide();
            }
        },
        error: function () {
            alert("Ocurrio un error al procesar la peticion.");
            $("#status").hide();
        },
    });
}

function createCfdi(shop, id, idCreditNote, version) {
    $ = jQuery191;
    var host = getHost();
    var route = '/Shopify/Invoice' + version + '/CreateCfdiStoreFront';

    $("#status").show();
    $.ajax({
        type: 'GET',
        dataType: 'jsonp',
        async:false,
        url: host + route,
        data: { ShopName: shop, idShopifyInvoice: (idCreditNote > 0 ? idCreditNote : id) },
        success: function (obj) {
            if (obj.existInvoice == true) {
                if (idCreditNote != null)
                    createCfdi(shop, id,null);
                alert("Ya se ha generado la factura, consultala en el correo proporcionado.");
            }
            if (obj.success == true && obj.send == true)
                alert("Se creó correctamente la Factura y se envió al correo proporcionado.");
            else if (obj.success == true && obj.send == false)
                alert("Se creó correctamente la Factura.");
            else
                alert(obj.message);
            $("#status").hide();
        },
        error: function () {
            alert("Ocurrio un error al procesar la peticion.");
            $("#status").hide();
        },
    });
}

function getDataClient() {
    $ = jQuery191;
    var clie = new Object();
    var addressClie = new Object();
    var id = $("#IdClient").val();
    var name = $("#Name").val();
    var rfc = $("#Rfc").val();
    var email = $("#Email").val();
    var street = $("#Street").val();
    var numExt = $("#ExteriorNumber").val();
    var numInt = $("#InteriorNumber").val();
    var neigh = $("#Neighborhood").val();
    var zip = $("#Zipcode").val();
    var locality = $("#Locality").val();
    var municipality = $("#Municipality").val();
    var state = $("#cmbState").val();
    var payment = $("#cmbPaymentMethodSho").val();
    var useCfdi = $('#cfdiUse').val();
    var iva = $('#useIva') != undefined ? $('#useIva').val() : null;
    var useIeps = $('#cmbBreakDownIeps').val();
    var paymenthForm = $('#cmbPaymentForm').val();
    var fiscalregime = $('#cmbFiscalRegimes').val();

    addressClie.Street = street != "" ? street : null;
    addressClie.ExteriorNumber = numExt != "" ? numExt : null;
    addressClie.InteriorNumber = numInt;
    addressClie.Neighborhood = neigh != "" ? neigh : null;
    addressClie.ZipCode = zip;
    addressClie.Locality = locality;
    addressClie.Municipality = municipality != "" ? municipality : null;
    addressClie.State = state != "" ? state : null;
    addressClie.Country = rfc == "XEXX010101000" ? null : "Mexico";


    clie.Id = id;
    clie.Rfc = rfc;
    clie.Name = name;
    clie.Email = email;
    clie.Address = addressClie;
    clie.PaymentMethod = payment;
    clie.CfdiUse = useCfdi;
    clie.IvaPercentage = iva;
    clie.ShowIeps = useIeps == undefined ? null : useIeps;
    clie.IvaPercentage = iva;
    clie.PaymentForm = paymenthForm;
    clie.FiscalRegime = fiscalregime;

    return clie;
} 

function getCheckOutElements(isStore) {
    var model = new Object();
    var address = new Object();

    if (isStore == false) {
        model.Shop = $("[name=ShopName]").val();
        model.order_id = $("[name=OrderId]").val();
    }
    else if (Shopify != null && Shopify.checkout != null) {

        model.BillingAddress = address;
        model.CreatedAt = Shopify.checkout.created_at;
        model.Currency = Shopify.checkout.currency;
        if (Shopify.checkout.source_name != "pos") {
            model.customer_id = Shopify.checkout.customer_id != null ? Shopify.checkout.customer_id.toString() : "";
            model.Email = Shopify.checkout.email;
        }
        model.order_id = Shopify.checkout.order_id.toString();
        model.Token = Shopify.checkout.token;
        model.Shop = Shopify.shop;
    }
    return model;
}

function getAddressElements() {
    var address = new Object();
    if (Shopify != null && Shopify.checkout != null && Shopify.checkout.billing_address != null) {

        address.Address1 = Shopify.checkout.billing_address.address1;
        //address.Address2 = Shopify.checkout.billing_address.address2;
        address.City = Shopify.checkout.billing_address.city;
        address.Company = Shopify.checkout.billing_address.company;
        address.Country = Shopify.checkout.billing_address.country;
        address.CountryCode = Shopify.checkout.billing_address.country_code;
        address.FirstName = Shopify.checkout.billing_address.first_name;
        address.LastName = Shopify.checkout.billing_address.last_name;
        address.Phone = Shopify.checkout.billing_address.phone;
        address.Province = Shopify.checkout.billing_address.province;
        address.ProvinceCode = Shopify.checkout.billing_address.province_code;
        address.Zip = Shopify.checkout.billing_address.zip;

    }
    return address;
}

function loadDataByRfc(e) {
    loadCfdiUses(e);
    if ($("#cmbFiscalRegimes").is(":visible")){
        getRegimes(e);
    }
}

function loadCfdiUses(e) {
    $ = jQuery191;
    var keyword = e.value;
    var dropDown = $("#cfdiUse");
    var allOptions = dropDown.find('option');

    if (keyword.length <= 12) {//es persona moral
        allOptions.each(function () {
            var elem = $(this);
            var value = elem.val();
            if (value.indexOf("D") == 0) {
                elem.hide();
               
            } else {
                elem.show();
            }
        });
    } else {
        allOptions.each(function () {
            var elem = $(this);
            elem.show();
        });
    }
    //getRegimes(e);
}

function getRegimes(e, fiscalRegime) {

    $ = jQuery191;
    var keyword = e.value;
    var dropDown = $("#cmbFiscalRegimes");
    var allOptions = dropDown.find('option');

    if (keyword.length <= 12) {//es persona moral
        allOptions.each(function () {
            var elem = $(this);
            var ismoral = elem.data('moral');

            if (ismoral == undefined || ismoral == 1) {
                elem.show();
            } else {
                elem.hide();
            }
        });
    } else {
        allOptions.each(function () {
            var elem = $(this);
            var ismoral = elem.data('moral');

            if (ismoral == undefined || ismoral == 0) {
                elem.show();
            } else {
                elem.hide();
            }
        });
    }

    var fiscalRegime = $('[name="FiscalRegime"]').val();
    $('#cmbFiscalRegimes').val(fiscalRegime);
}

//function fillCmbRegimes(e, catalogRegimes, selected) {
//    //getCurrentBusinessLine();  
//    var component;
//    if (e.name == undefined || !e.name.includes('ThirdPartyAccount.Rfc'))
//        component = $('#cmbFiscalRegimes');
//    else {
//        var id = e.name.split('[')[1].split(']')[0];
//        component = $('#cmbFiscalRegimes_' + id);
//    }

//    var keyword = $(e).val();
//    var isNatural = false;

//    component.empty().append($("<option />").val("").text('Selecciona el Régimen fiscal'));

//    if (keyword.length > 12) {
//        isNatural = true;
//    }
//    $.each(catalogRegimes, function (idx, value) {
//        natural = value.Natural;
//        moral = value.Moral;

//        //console.log(natural);
//        if (isNatural) {
//            if (natural === isNatural) {
//                // console.log(value.Name);
//                component.append($("<option />").val(value.Value).text(value.Value + " - " + value.Name));
//            }
//        } else {
//            if (moral != isNatural) {
//                component.append($("<option />").val(value.Value).text(value.Value + " - " + value.Name));
//            }
//        }
//    });
//    if (selected != null || selected != undefined)
//        $('#cmbFiscalRegimes').val(selected);
//}

//>>> Validaciones =============================================================

// Valida los datos ingresados a un cliente
function ValidateClient() {
    var error;
    error = ValidateRequiered("Name", "Razon Social");
    //if (error != "") return error;

    valor = document.getElementById("Rfc").value;
    if (valor.length < 12)
        error += "*El RFC debe de contener la Homoclave, </br>" +
            "por lo tanto deben de ser de 12 a 13 caracteres.";
    if (!ValidateRfc(valor)) // RFC
        error += "* El RFC no tiene el formato correcto</br>" +
            "Ejemplo: XAXX010101000 </br>";

    error += ValidateRequiered("Rfc", "RFC");
    //if (error != "") return error;

    valor = document.getElementById("Email").value;
    if (!ValidateEmail(valor)) // RFC
        error += "* El correo no tiene el formato correcto</br>";

    error += ValidateRequiered("Email", "Correo Electronico");


    if ($("#version").val() == "4.0") {
        error += ValidateRequiered("Zipcode", "Codigo Postal");
        error += ValidateRequiered("cmbFiscalRegimes", "Regimen Fiscal");
    }


    //if (error != "") return error;

    //error += ValidateRequiered("Street", "Calle");
    ////if (error != "") return error;

    //error += ValidateRequiered("ExteriorNumber", "Numero Exterior");
    ////if (error != "") return error;

    //error += ValidateRequiered("Neighborhood", "Colonia");
    ////if (error != "") return error;

    //if (error != "") return error;

    //error += ValidateRequiered("Municipality", "Municipio");
    //if (error != "") return error;

    error += ValidateRequiered("cfdiUse", "Uso de la factura");
    error += ValidateRequiered("cmbPaymentMethodSho", "Método de pago");
    if (error != "") return error;

    //var valor = document.getElementById("Zipcode").value;
    //if (!/^\d{5}$/.test(valor)) return "El código Postal solo puede tener 5 digitos";

    //var indice = document.getElementById("cmbState").value; // Estado
    //if (indice == 0)
    //    return "Debe seleccionar un estado.";


    //var countryId = document.getElementById("cmbTaxCountry").selectedIndex;
    //if (countryId == 1) { //Solo si es Mexico
    //    if (indice == null || indice == 0) {
    //        return "Seleccione un estado del combo";
    //    }
    //}


    return "";
}

function ValidateRequiered(idElement, name, montant) {
    var cosa = document.getElementById(idElement);
    if (cosa == null)
        return "";

    var valor = cosa.value;
    if (valor == null || valor.length == 0 || /^\s+$/.test(valor))
        return "* El campo " + name + " es obligatorio. </br>";
    else {
        if (montant != null && valor.length > montant)
            return "* El campo " + name + " Solo puede contener " + montant + " simbolos </br>";
    }
    return "";
}

// Valida que un RFC sea correcto (True = Correcto)
function ValidateRfc(rfcStr) {
    var strCorrecta;
    strCorrecta = rfcStr;
    var valid = "[A-Z&Ñ]{3,4}[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[A-Z0-9]{2}[0-9A]";
    var validRfc = new RegExp(valid);
    var matchArray = strCorrecta.match(validRfc);
    if (matchArray == null)
        return false;
    else
        return true;
}

function ValidateEmail(emailSrc) {
    var expr = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    if (!expr.test(emailSrc))
        return false;
    else
        return true;
}
//<<< Validaciones =============================================================