/* 
* Copyright 2016 Agencia Estatal de Administración Tibutaria
*
* Licencia con arreglo a la EUPL, Versión 1.1 o –en cuanto
* sean aprobadas por la Comisión Europea– versiones
* posteriores de la EUPL (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en:
*  
* https://joinup.ec.europa.eu/software/page/eupl
*  
* Salvo cuando lo exija la legislación aplicable o se acuerde
* por escrito, el programa distribuido con arreglo a la
* Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
* DE NINGÚN TIPO, ni expresasni implícitas.
*
* Véase la Licencia en el idioma concreto que rige los permisos y 
* limitaciones que establece la Licencia.
*/ 

package gestor;

import gestor.utiles.Global;
import gestor.utiles.ConfiguracionBase;
import java.awt.*;
import java.io.*;
import java.util.*;

public class Configuracion extends ConfiguracionBase {

    private final String nombreFichero = "ConfiguracionAutoservicio.ini";
    private static Configuracion _yo = null;

    public static Configuracion instanciaUnica() {
        if (_yo == null) {
            _yo = new Configuracion();
        }
        return _yo;
    }
    public String centro;
    public String codigoCentro;
    public String codigoGestor;
    public String ipServidor;
    public int puertoIpServidor;
    public String ipServidorSec;
    public int puertoIpServidorSec;
    public String nombreServidor;
    public boolean usandoUDP = false;
    public long margenRetraso;
    public long margenPenalizacion;
    public int maxButons;
    public boolean cursorVisible;
    public int altoBoton;
    public int sizeFont = -1;
    public String codigoCerrado;
    public InfoServicios infoServicios = new InfoServicios();
    // parametros impresion tickets
    public String impresora;
    public String textoSalaEspera;
    public byte[] codigosCorteTicket;
    public float margenTicketSuperior;
    public float margenTicketInferior;
    public float margenTicketIzquierdo;
    public float margenTicketDerecho;
    public float anchoTicket;
    public float altoTicket;
    public String textoAgenciaTributaria = "Agencia Tributaria";
    public String textoCortoAgenciaTributaria = "AEAT";
    public Color colorPanel = new Color(240, 240, 240);
    public Color rotuloClaro = new Color(200, 200, 220);
    public Color rotuloOscuro = new Color(170, 170, 190);
    public Color colorReloj = new Color(0, 0, 0);
    public int segundosCierreVentanas = 15;
    public int segundosTicketVisual = 0;
    public boolean bloquearTeclado = true;
    public int tiempoSalvaPantalla = 600000; // diez minutos
    // public boolean bloquearNotificaciones = false;

    public float factorSalvaPantalla = 0.12f;
    public String horaApagadoMaquina = "";
    public boolean comprobarImpresora = false;
    public boolean esImpresoraCUSTOM = false;
    public boolean esImpresoraEpson = false;

    public boolean testComprobarImpresora = false;
    public int segundosAyuda = 30;
    public ArrayList<String> serviciosVisibles;
    public ArrayList<String> excluirGestionHuecos;
    public HashMap<String, String> nombresColas;
    public boolean usandoSubmenus = false;
    public int minutosMargenCita = 60;
    public int minutosTicketInmediato = 20;
    public File ficheroSubmenu;
    public ArrayList<String> colasAyudaObligatoria = new ArrayList<String>();
    public boolean ignorarTurnos = false;
    public boolean mostrarBotonCitaPrevia = true;
    public boolean enVentana = false;
    public boolean imprimirHoraCita = true;
    public boolean imprimirHoraTicket = false;
    public String textoHoraCita = "Hora cita: ";
    public String textoHoraTicket = "Hora emisión tique: ";
    public static String ficheroEjecucion = "javaw -jar autoservicio.jar";
    public int incrBotonMenu = 0;

    public boolean doblePantalla = false;
    public boolean modoDebug = false;
    public int ttbGrande = 25;
    public int ttbChico = 13;
    public String colorGrande = "#000066";
    public String colorChico = "gray";
//    public boolean tecladoQuerty = false;
//    public boolean mostrarBotonQuerty = false;
    public String SalasValidas = "";
    public String iconoBoton = "";
    public String iconoImpresion = "";
    public boolean imprimirLogo = false;
    public boolean usarApellidos = false;
    public boolean usarBotonDNI = false;
    public boolean permitirNoIden = true;

    private Configuracion() {
        super();
    }

    public boolean cargar() {
        super.cargar(nombreFichero);
        ipServidor = valor("IpServidor", "0.0.0.0");
        puertoIpServidor = valor("IpPort", 5000);
        nombreServidor = valor("nombreServidor", "");
        if (!nombreServidor.equals("")) {
            usandoUDP = true;
        }
        ipServidorSec = valor("IpServidorSec", "");
        if (ipServidorSec.equals("")) {
            ipServidorSec = ipServidor;
        }
        puertoIpServidorSec = valor("IpPortSec", 0);
        if (puertoIpServidorSec == 0) {
            puertoIpServidorSec = puertoIpServidor;
        }
        centro = valor("centro", "AGENCIA TRIBUTARIA");
        codigoCentro = valor("codigoCentro", "");
        codigoGestor = valor("codigoGestor", "Tactil");
        if (codigoGestor.length() > 9) {
            codigoGestor = codigoGestor.substring(0, 9);
        }
        maxButons = valor("maxBotones", 12);
        if (maxButons > 18) {
            maxButons = 18;
        }

        impresora = valor("impresora", "");
        String codigoCorte = valor("codigosCorte", "");
        preparaCorte(codigoCorte);
        margenTicketSuperior = valor("MargenTicketsuperior", 5f);
        margenTicketInferior = valor("MargenTicketInferior", 0f);
        margenTicketIzquierdo = valor("MargenTicketIzquierdo", 5f);
        margenTicketDerecho = valor("MargenTicketDerecho", 5f);
        anchoTicket = valor("AnchoTicket", 65f);
        altoTicket = valor("AltoTicket", 50f);
        imprimirHoraCita = valor("ImprimirHoraCita", imprimirHoraCita);
        imprimirHoraTicket = valor("ImprimirHoraTicket", imprimirHoraTicket);
        textoHoraCita = valor("TextoHoraCita", textoHoraCita);
        textoHoraTicket = valor("TextoHoraTique", textoHoraTicket);

        cursorVisible = valor("cursorVisible", false);
        altoBoton = valor("AltoBoton", 90);
        sizeFont = valor("TamañoFuente", -1);
        codigoCerrado = valor("CodigoCerrado", "1234");
        colorPanel = valorColor("ColorPanel", colorPanel);
        rotuloOscuro = valorColor("ColorRotuloExterior", rotuloOscuro);
        rotuloClaro = valorColor("ColorRotuloInterior", rotuloClaro);
        colorReloj = valorColor("colorReloj", colorReloj);

        String strIdiomas = valor("idiomas", "");
        Global.gestorIdiomas.cargarIdiomas(strIdiomas);
        segundosCierreVentanas = valor("SegundosCierreVentanas", segundosCierreVentanas);
        segundosTicketVisual = valor("SegundosVentanaTicket", segundosTicketVisual);
        String listaServicios = valor("serviciosVisibles", "").trim().toUpperCase();
        String sinGestionDeHuecos = valor("ColasQueNoOfrecenHuecos", "");
        cargarServicios(listaServicios, sinGestionDeHuecos);

        double minutosSalvaPantalla = valor("MinutosSalvaPantalla", -1.0);
        if (minutosSalvaPantalla > -1) {
            tiempoSalvaPantalla = (int) (minutosSalvaPantalla * 60 * 1000);
        }
        factorSalvaPantalla = valor("factorSalvaPantalla", factorSalvaPantalla);
        bloquearTeclado = valor("BloquearTeclado", bloquearTeclado);
        horaApagadoMaquina = valor("HoraApagadoMaquina", "");

        comprobarImpresora = valor("ComprobarImpresora", comprobarImpresora);
        esImpresoraCUSTOM = valor("EsImpresoraCUSTOM", esImpresoraCUSTOM);
        esImpresoraEpson = valor("EsImpresoraEpson", esImpresoraEpson);

        segundosAyuda = valor("SegundosAyuda", segundosAyuda);
        minutosMargenCita = valor("MinutosOfrecerCitas", minutosMargenCita);
        minutosTicketInmediato = valor("minutosTicketInmediato", minutosTicketInmediato);

        String ayudaObligatoria = valor("AyudaObligatoria", "");
        if (ayudaObligatoria.length() > 0) {
            String[] ps = Global.split(ayudaObligatoria.toUpperCase(), ',');
            for (int i = 0; i < ps.length; i++) {
                colasAyudaObligatoria.add(ps[i]);
            }
        }

        ignorarTurnos = valor("IgnorarTurnos", ignorarTurnos);
        mostrarBotonCitaPrevia = valor("MostrarBotonCitaPrevia", mostrarBotonCitaPrevia);
        enVentana = valor("EnVentana", enVentana);

        ficheroEjecucion = valor("FicheroEjecucion", ficheroEjecucion);

        incrBotonMenu = valor("IncrementoBotonMenu", incrBotonMenu);

        doblePantalla = valor("DoblePantalla", doblePantalla);

        modoDebug = valor("debug", false);
        SalasValidas = valor("salasValidas", "Vacio");
        iconoBoton = valor("iconoBoton", "");
        iconoImpresion = valor("iconoImpresion", "");
        textoAgenciaTributaria = valor("TextoAgenciaTributaria", "Agencia Tributaria");
        String curDir = System.getProperty("user.dir");
        iconoBoton = existeFichero(iconoBoton, curDir);
        iconoImpresion = existeFichero(iconoImpresion, curDir);
        imprimirLogo = valor("imprimirLogo", false);
        usarApellidos = valor("usarApellidos", false);
        usarBotonDNI = valor("MostrarBotonDNI", false);
        ttbGrande = valor("TamañoTextoBoton", ttbGrande);
        ttbChico = valor("TamañoDetalleBoton", ttbChico);
        colorGrande = valor("ColorTextoBoton", colorGrande);
        colorChico = valor("ColorDetalleBoton", colorChico);

        return true;

    }

    public String existeFichero(String fichero, String curdir) {
        if (fichero.length() <= 4) {
            return "";
        }
        fichero = curdir + "\\" + fichero;
        boolean exists = (new File(fichero)).exists();
        if (exists == false) {
            return "";
        } else {
            return fichero;
        }

    }

    void cargarServicios(String listaServicios, String sinGestionDeHuecos) {
        File infoMenusXml = new File(Global.gestorIdiomas.rutaIdiomaPrincipal + "submenus.xml");
        File infoMenusIni = new File(Global.gestorIdiomas.rutaIdiomaPrincipal + "submenus.ini");
        File infoNMenuIni = new File(Global.gestorIdiomas.rutaIdiomaPrincipal + "menu.ini");
        if (infoNMenuIni.exists()) {
            ficheroSubmenu = infoNMenuIni;
            usandoSubmenus = true;
            if (altoBoton < 130) {
                altoBoton = 160;  // TODO TENTATIVO .... ******
            }
        } else if (infoMenusXml.exists()) {
            ficheroSubmenu = infoMenusXml;
            usandoSubmenus = true;
        } else if (infoMenusIni.exists()) {
            ficheroSubmenu = infoMenusIni;
            usandoSubmenus = true;
        }
        nombresColas = new HashMap<String, String>();
        for (java.util.Iterator<String> it = data.keySet().iterator(); it.hasNext();) {
            Dato d;
            d = data.get(it.next());
            if (d.clave.length() == 1) {
                nombresColas.put(d.clave.toUpperCase(), d.valor);
            }
        }
        if (!usandoSubmenus && listaServicios.length() > 0) {
            serviciosVisibles = new ArrayList<String>();
            String[] sv = Global.split(listaServicios, ',');
            for (String sv1 : sv) {
                serviciosVisibles.add(sv1.trim());
            }
        }
        excluirGestionHuecos = new ArrayList<String>();
        if (sinGestionDeHuecos.length() > 0) {
            String[] sv = Global.split(sinGestionDeHuecos, ',');
            for (String sv1 : sv) {
                excluirGestionHuecos.add(sv1.trim());
            }
        }
    }

    void preparaCorte(String codigoCorte) {
        if (codigoCorte.equals("")) {
            codigosCorteTicket = null;
            return;
        }
        String[] cods = Global.split(codigoCorte, ',');
        codigosCorteTicket = new byte[cods.length];
        for (int i = 0; i < cods.length; i++) {
            codigosCorteTicket[i] = Byte.parseByte(cods[i]);
        }
    }

    public boolean guardar() {
        ponValor("impresora", impresora);
        return super.guardar();
    }
}
