import $ from "jquery";

import alertify from "alertifyjs";
import "alertifyjs/build/css/alertify.min.css";

const fieldDepartmentValues = new Set([
    "legal_entity",
    "other",
]);

$(window).ready(
    () => {
        let isNaturalPerson = ($("#id_entity_type").find(":selected").val() === "natural_person");
        let isEmpty = ($("#id_entity_type").find(":selected").val() === "");
        
        $(".field-date_of_birth").
        css(
            "display",
            (
                (isNaturalPerson) ?
                "block" : "none"
            )
        );
        
        $(".field-ico_number,.field-load_ares_data_button").
        css(
            "display",
            (
                (!isEmpty && !isNaturalPerson) ?
                "block" : "none"
            )
        );
        
        $(".field-department").
        css(
            "display",
            (
                (!isEmpty && fieldDepartmentValues.has($("#id_entity_type").find(":selected").val())) ?
                "block" : "none"
            )
        );

        if (!isNaturalPerson && !isEmpty) $("#id_date_of_birth").val("");
        if (isNaturalPerson) $("#id_ico_number").val("");
        if (!fieldDepartmentValues.has($("#id_entity_type").find(":selected").val()) && !isEmpty) $("#id_department").val("");

        $("#id_entity_type").on(
            "change",
            event => {
                isEmpty = ($(event.target).val() === "");
                isNaturalPerson = ($(event.target).val() === "natural_person");
                
                $(".field-date_of_birth").
                css(
                    "display",
                    (
                        (!isEmpty && isNaturalPerson) ?
                        "block" : "none"
                    )
                );
                $(".field-ico_number,.field-load_ares_data_button").
                css(
                    "display",
                    (
                        (!isEmpty && !isNaturalPerson) ?
                        "block" : "none"
                    )
                );
                
                $(".field-department").
                css(
                    "display",
                    (
                        (!isEmpty && fieldDepartmentValues.has($(event.target).val())) ?
                        "block" : "none"
                    )
                );
                
                if (!isNaturalPerson && !isEmpty) $("#id_date_of_birth").val("");
                if (isNaturalPerson) $("#id_ico_number").val("");
                if (!fieldDepartmentValues.has($(event.target).val()) && !isEmpty) $("#id_department").val("");
            }
        );
        
        $("#load_ares_data").on(
            "click",
            async (event) => {
                const icoValue = $("#id_ico_number").val();
                
                const rawAresXMLResponse = await fetch(
                    `/ares-info-proxy/${icoValue}`
                );
                
                if (!rawAresXMLResponse.ok) {
                    alertify.error("Chyba při načítní dat z ARES.");
                    
                    console.warn(
                        "Error loading ARES data: ",
                        await rawAresXMLResponse.text()
                    );
                    
                    return;
                }
                
                const formattedAresData = new DOMParser().parseFromString(
                    await rawAresXMLResponse.text(),
                    "text/xml"
                );
                
                const errors = formattedAresData.getElementsByTagName("are:Error");
                
                if (errors.length !== 0) {
                    alertify.error("Chyba při načítní dat z ARES. Je IČO zadáno správně?");
                    
                    console.warn(
                        "Error(s) loading ARES data: ",
                        errors
                    );
                    
                    return;
                }
                
                let streetResult = "";
                
                const streetElements = formattedAresData.getElementsByTagName("dtt:Nazev_ulice");
                
                if (streetElements.length !== 0) {
                    streetResult += streetElements[0].innerHTML;
                }
                
                const houseNumberElements = formattedAresData.getElementsByTagName("dtt:Cislo_domovni");
                
                if (houseNumberElements.length !== 0) {
                    streetResult += ` ${houseNumberElements[0].innerHTML}`;
                }
                
                const orientationNumberElements = formattedAresData.getElementsByTagName("dtt:Cislo_orientacni");
                
                if (orientationNumberElements.length !== 0) {
                    streetResult += `/${orientationNumberElements[0].innerHTML}`;
                }
                
                $("#id_name").val(formattedAresData.getElementsByTagName("are:Obchodni_firma")[0].innerHTML)
                $("#id_address_street_with_number").val(streetResult);
                $("#id_address_district").val(formattedAresData.getElementsByTagName("dtt:Nazev_obce")[0].innerHTML);
                $("#id_address_zip").val(formattedAresData.getElementsByTagName("dtt:PSC")[0].innerHTML);
                // IČO numbers will always be in the Czech Republic.
                $("#id_address_country").val("Česká Republika");
                
                console.log(formattedAresData);
            }
        );
    }
);