/*
 * Copyright (C) 2021 Ángel Benítez Hernández, Echedey López Romero
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

let Documentos = [
    {
        'id': 'nif',
        'nombre': 'NIF'
    },
    {
        'id': 'nie',
        'nombre': 'NIE'
    }
];

let Paises = [
    {
        'id': 'espania',
        'nombre': 'España'
    }
];

let FiltroProvincias = [
    {
        'provincia_id': '35'
    }, {
        'provincia_id': '38'
    }
];

let Provincias;
let Islas;
let Municipios;
let Localidades;
let CPs;

function GenerarValoresCampo(Datos, NombreCampo) {
    let ValoresCampo = [];

    Datos.forEach((Valor, Clave) => {
        ValoresCampo.push(Valor[NombreCampo]);
    });

    return ValoresCampo;
}

function DatosCanarias(Datos, ValoresDependientes, NombreCampo, NoId = false, NuevaId = '') {
    let DatosCanarias = [];

    ValoresCampo = GenerarValoresCampo(ValoresDependientes, NombreCampo);

    Datos.forEach((Valor, Clave) => {
        if (ValoresCampo.includes(Valor[NombreCampo])) {
            if (NoId === true && NuevaId !== '') {
                Valor[NuevaId] = Clave.toString();
                DatosCanarias.push(Valor);
            } else {
                DatosCanarias.push(Valor);
            }
        }
    });

    return DatosCanarias;
}

// Cargar datos
async function CargarDatos() {
    await $.getJSON('./datos/provincias.json', function (Datos) {
        Provincias = DatosCanarias(Datos, FiltroProvincias, 'provincia_id');
    });
    await $.getJSON('./datos/islas.json', function (Datos) {
        Islas = DatosCanarias(Datos, Provincias, 'provincia_id');
    });
    await $.getJSON('./datos/municipios_islas.json', function (Datos) {
        Municipios = DatosCanarias(Datos, Provincias, 'provincia_id');
    });
    await $.getJSON('./datos/localidades_islas.json', function (Datos) {
        Localidades = DatosCanarias(Datos, Provincias, 'provincia_id', true, 'localidad_id');
    });
    await $.getJSON('./datos/codigos_postales_municipios.json', function (Datos) {
        CPs = DatosCanarias(Datos, Municipios, 'municipio_id', true, 'cp_id');
    });
}
;

function ComprobarValorArray(Datos, Contenido, Nombre) {
    let Existe = false;

    Datos.forEach((Valor, Clave) => {
        if (Valor[Nombre] === Contenido) {
            Existe = true;
        }
    });

    return Existe;
}

function GenerarValoresPosibles(Datos, Contenido, Nombre) {
    let ValoresPosibles = [];

    Datos.forEach((Valor, Clave) => {
        if (Valor[Nombre] === Contenido) {
            ValoresPosibles.push(Valor);
        }
    });

    return ValoresPosibles;
}

function ReiniciarIdentificacion() {
    let Identificacion = document.getElementById('identificacion');

    Identificacion.removeAttribute('pattern');
    Identificacion.removeAttribute('title');
    Identificacion.setAttribute('disabled', '');
}

function MostrarIdentificacion() {
    let Documento = document.getElementById('documento').value;
    let Identificacion = document.getElementById('identificacion');

    if (Documento === Documentos[0]['id']) {
        Identificacion.removeAttribute('disabled');
        Identificacion.setAttribute('pattern', '[0-9]{8}[a-zA-Z]');
        Identificacion.setAttribute('title', 'Un número de 8 dígitos y un caracter alfabético');
    } else if (Documento === Documentos[1]['id']) {
        Identificacion.removeAttribute('disabled');
        Identificacion.setAttribute('pattern', '[a-zA-Z][0-9]{7}[a-zA-Z]');
        Identificacion.setAttribute('title', 'Un caracter alfabético, un número de 7 dígitos y otro caracter alfabético');
    }
}

function ReiniciarCP() {
    let CP = document.getElementById('cp');

    CP.value = '';
    CP.setAttribute('disabled', '');
}

function MostrarCP() {
    let Municipio = document.getElementById('municipio').value;
    let CP = document.getElementById('cp');

    let ValoresPosibles = GenerarValoresPosibles(CPs, Municipio, 'municipio_id');

    if (ValoresPosibles.length !== 0) {
        CP.removeAttribute('disabled');

        for (let Posicion = 1; Posicion < CP.length; Posicion++) {
            let Opcion = CP[Posicion];
            if (ComprobarValorArray(ValoresPosibles, Opcion.value, 'cp_id')) {
                Opcion.removeAttribute('style');
            } else {
                Opcion.style.display = 'none';
            }
        }
    } else {
        for (let Posicion = 1; Posicion < CP.length; Posicion++) {
            let Opcion = CP[Posicion];

            Opcion.removeAttribute('style');
        }
    }
}

function ReiniciarLocalidad() {
    let Localidad = document.getElementById('localidad');

    Localidad.value = '';
    Localidad.setAttribute('disabled', '');
}

function MostrarLocalidad() {
    let Municipio = document.getElementById('municipio').value;
    let Localidad = document.getElementById('localidad');

    let ValoresPosibles = GenerarValoresPosibles(Localidades, Municipio, 'municipio_id');

    if (ValoresPosibles.length !== 0) {
        Localidad.removeAttribute('disabled');

        for (let Posicion = 1; Posicion < Localidad.length; Posicion++) {
            let Opcion = Localidad[Posicion];
            if (ComprobarValorArray(ValoresPosibles, Opcion.value, 'localidad_id')) {
                Opcion.removeAttribute('style');
            } else {
                Opcion.style.display = 'none';
            }
        }
    } else {
        for (let Posicion = 1; Posicion < Localidad.length; Posicion++) {
            let Opcion = Localidad[Posicion];

            Opcion.removeAttribute('style');
        }
    }
}

function ReiniciarMunicipio() {
    let Municipio = document.getElementById('municipio');

    Municipio.value = '';
    Municipio.setAttribute('disabled', '');
}

function MostrarMunicipio() {
    let Isla = document.getElementById('isla').value;
    let Municipio = document.getElementById('municipio');

    let ValoresPosibles = GenerarValoresPosibles(Municipios, Isla, 'isla_id');

    if (ValoresPosibles.length !== 0) {
        Municipio.removeAttribute('disabled');

        for (let Posicion = 1; Posicion < Municipio.length; Posicion++) {
            let Opcion = Municipio[Posicion];
            if (ComprobarValorArray(ValoresPosibles, Opcion.value, 'municipio_id')) {
                Opcion.removeAttribute('style');
            } else {
                Opcion.style.display = 'none';
            }
        }
    } else {
        for (let Posicion = 1; Posicion < Municipio.length; Posicion++) {
            let Opcion = Municipio[Posicion];

            Opcion.removeAttribute('style');
        }
    }

    ReiniciarLocalidad();
    ReiniciarCP();
    MostrarLocalidad();
    MostrarCP();
}

function ReiniciarIsla() {
    let Isla = document.getElementById('isla');

    Isla.value = '';
    Isla.setAttribute('disabled', '');
}

function MostrarIsla() {
    let Provincia = document.getElementById('provincia').value;
    let Isla = document.getElementById('isla');

    let ValoresPosibles = GenerarValoresPosibles(Islas, Provincia, 'provincia_id');

    if (ValoresPosibles.length !== 0) {
        Isla.removeAttribute('disabled');

        for (let Posicion = 1; Posicion < Isla.length; Posicion++) {
            let Opcion = Isla[Posicion];
            if (ComprobarValorArray(ValoresPosibles, Opcion.value, 'isla_id')) {
                Opcion.removeAttribute('style');
            } else {
                Opcion.style.display = 'none';
            }
        }
    } else {
        for (let Posicion = 1; Posicion < Isla.length; Posicion++) {
            let Opcion = Isla[Posicion];

            Opcion.removeAttribute('style');
        }
    }

    ReiniciarMunicipio();
    MostrarMunicipio();
}

function ReiniciarProvincia() {
    let Provincia = document.getElementById('provincia');

    Provincia.value = '';
    Provincia.setAttribute('disabled', '');
}

function MostrarProvincia() {
    let Pais = document.getElementById('pais').value;
    let Provincia = document.getElementById('provincia');

    if (Pais === Paises[0]['id']) {
        Provincia.removeAttribute('disabled');

        for (let Posicion = 1; Posicion < Provincia.length; Posicion++) {
            let Opcion = Provincia[Posicion];
            if (ComprobarValorArray(Provincias, Opcion.value, 'provincia_id')) {
                Opcion.removeAttribute('style');
            } else {
                Opcion.style.display = 'none';
            }
        }
    } else {
        for (let Posicion = 1; Posicion < Provincia.length; Posicion++) {
            let Opcion = Provincia[Posicion];

            Opcion.removeAttribute('style');
        }
    }

    ReiniciarIsla();
    MostrarIsla();
}

function AniadirOnChange() {
    let Documento = document.getElementById('documento');
    let Pais = document.getElementById('pais');
    let Provincia = document.getElementById('provincia');
    let Isla = document.getElementById('isla');
    let Municipio = document.getElementById('municipio');

    Documento.setAttribute('onchange', 'ReiniciarIdentificacion(); MostrarIdentificacion();')
    Pais.setAttribute('onchange', 'ReiniciarProvincia(); MostrarProvincia();');
    Provincia.setAttribute('onchange', 'ReiniciarIsla(); MostrarIsla();');
    Isla.setAttribute('onchange', 'ReiniciarMunicipio(); MostrarMunicipio();');
    Municipio.setAttribute('onchange', 'ReiniciarCP(); ReiniciarLocalidad(); MostrarCP(); MostrarLocalidad();');
}

(async () => {
    await CargarDatos();

    MostrarIdentificacion();
    MostrarCP();
    MostrarLocalidad();
    MostrarMunicipio();
    MostrarIsla();
    MostrarProvincia();

    AniadirOnChange();

    bsCustomFileInput.init();
})();
