/* 
* 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 servidor;

import java.util.*;
import java.util.Date;
import java.util.logging.Level;
import servidor.utiles.*;
import servidor.utiles.ConfiguracionBase;

public class Configuracion extends ConfiguracionBase {

    public static boolean DEBUG = false;
    public int ipPort;
    public String codigoCentro;
    public String nombreServidor;
    public String nombreOficina;
    public int tiempoBucle;
    public int margenRetraso;
    public int tiempoPenalizacion;
    //public int numeroMesas;
    public int retrasoTicket;
    public boolean apagarOperadoresFantasma;
    public boolean modoSinGestor = false;
    public boolean modoColaCero = false;
    public int colasSimultaneas = 1;
    public boolean comprobarMonitores = true;
    public String servidorSql = "localhost";
    public String horaEjecucionRecepcion;
    public String horaEjecucionEnvio;
   //public Date  fechaInicio;
    //public Date  fechaFinal;
    public String pathBackupDatos = null;
    public boolean estimarRetrasos = false;
    public boolean resucitar = true;
    public String URLActualizacion = "";
    public int prioridadCitaPrevia;
    public Date horaTurnoTarde;
    String horaTurnoTardePorDefecto = "15:15:00";
    public ArrayList<ScriptUsuario> scriptsUsuario = new ArrayList<>();
    public ArrayList<String> usuariosAutorizados = new ArrayList<>();
    public boolean gestionHuecosActivada = true;
    public boolean modoTest = false;
    public boolean SQLExpress = true;
    public String SQLInstanceName = "ATENEO";
    public boolean logOcuparHuecos = false;
    public boolean modoVerboso = true;
    public boolean contestarResumenColas = true;
    protected static Configuracion yo = null;
    public boolean enviarEstadoAOperadores = false;
    public long maxRetrasoMensaje = 0;
    public boolean modoDepuracion = false;
    public boolean permitirEjecucionSimultanea = false;
    public String colaCero = null;
    public String Osql = "";
    public boolean forzarAutoenvio = false;
    public String PathJava = "";
    public String BaseDatosAte = "ateneo";
    public boolean ajustarMemoriaSQL = false;
    public boolean permitirNoIden = true;

    public static Configuracion getConfiguracion() {
        if (yo == null) {
            yo = new Configuracion();
        }
        return yo;
    }

    protected Configuracion() {
        super();
    }

    public static void comprobarDEBUG() {
        String mx = java.lang.management.ManagementFactory.getRuntimeMXBean().getInputArguments().toString();
        DEBUG = mx.indexOf("-Xdebug") > 0;
    }

    @Override
    public boolean cargar(String fichero) {
        try {
            super.cargar(fichero);
            ipPort = valor("IpPort", 5000);
            codigoCentro = valor("codigoCentro", "");
            nombreServidor = valor("nombreServidor", "");
            nombreOficina = valor("nombreOficina", "Agencia Tributaria");

            tiempoBucle = valor("tiempoBucle", 10);
            margenRetraso = valor("margenRetraso", 20);
            tiempoPenalizacion = valor("tiempoPenalizacion", 0);
            retrasoTicket = valor("retrasoTicket", 20) * 1000;

            modoSinGestor = !valor("recepcionista", true);
            modoColaCero = valor("autoenvioColaCero", false);
            servidorSql = valor("ServidorSql", "localhost");
            //  SQLExpress = valor("UsarSqlExpress", true);
            SQLInstanceName = valor("SqlInstanceName", "ATENEO");
            pathBackupDatos = valor("PathBackup");
            //   URLActualizacion = valor("URLActualizacion", "");

            horaEjecucionRecepcion = valor("HoraEjecucionRecepcion", "04:15:00");
            horaEjecucionEnvio = valor("HoraEjecucionEnvio", "21:30:00");
            horaTurnoTarde = arreglarHora(valor("HoraTurnoTarde", horaTurnoTardePorDefecto));
            cargarValoresEnCaliente(false);
            cargarLineasEspeciales();
            colaCero = valor("ColaAutoenvio", "");
            //  Osql = valor("Osql","C:\\Archivos de programa\\Microsoft SQL Server\\100\\Tools\\Binn\\OSQL.EXE");
            // comprobarOSQL();
            forzarAutoenvio = valor("forzarAutoenvio", false);
            PathJava = valor("PathJava", "");
            BaseDatosAte = valor("BaseDatos", "ateneo");
            ajustarMemoriaSQL = valor("ajustarMemoriaSQL", false);
            permitirNoIden = valor("permitirNoIden", true);
            return true;
        } catch (Exception exc) {
            return false;
        }
    }

    void comprobarOSQL() {
//       File f = new File(Osql);
//
//       if (f.exists()) return;
//        pathBackupDatos = "";
//        ServidorMain.log.warning("No se encuenta Osql.exe en "+ Osql) ;
//        ServidorMain.log.warning("No se ejecutaran copias de suguridad") ;
    }

    public void cargarValoresEnCaliente(boolean recargar) {
        if (recargar) {
            data.clear();
            super.cargar(nombreFichero);
        }
        prioridadCitaPrevia = valor("PrioridadCitaPrevia", 0);
        maxRetrasoMensaje = valor("maxRetrasoMensaje", maxRetrasoMensaje);
        colasSimultaneas = valor("colasSimultaneas", 1);
        modoTest = valor("ModoTest", modoTest);
        comprobarMonitores = valor("comprobarMonitores", true);
        estimarRetrasos = valor("EstimarRetrasos", false);
        apagarOperadoresFantasma = valor("desconectarClientes", true);
        gestionHuecosActivada = valor("gestionHuecosActivada", gestionHuecosActivada);
        logOcuparHuecos = valor("LogOcuparHuecos", false);
        modoVerboso = valor("Verboso", modoVerboso);
        contestarResumenColas = valor("contestarResumenColasOpe", true);
        permitirEjecucionSimultanea = valor("permitirEjecucionSimultanea", false);
        enviarEstadoAOperadores = valor("enviarEstadoAOperadores", enviarEstadoAOperadores);
        if (modoSinGestor) {
            estimarRetrasos = false;
            resucitar = false;
        }
        forzarAutoenvio = valor("forzarAutoenvio", false);

    }

    Date arreglarHora(String hora) {
        if (java.util.regex.Pattern.matches("^\\d\\d:\\d\\d$", hora)) {
            hora += ":00";
        }
        if (!java.util.regex.Pattern.matches("^\\d\\d:\\d\\d:\\d\\d$", hora)) {
            hora = horaTurnoTardePorDefecto;
        }
        Date d = Fecha.convertirHora(hora);
        if (d == null) {
            d = Fecha.convertirHora(horaTurnoTardePorDefecto);
        }
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTime(d);
        gc.add(Calendar.MINUTE, -15);
        return gc.getTime();
    }

    void cargarLineasEspeciales() {
        for (Dato d : data) {
            String clave = d.clave.toLowerCase();
            if (clave.startsWith("script")) {
                String v = d.valor;
                String[] p = servidor.utiles.Global.split(v, ';');
                if (p.length < 2) { //linea mal formada, ignorar
                    ServidorMain.log.log(Level.WARNING, " ConfiguracionServidor.ini, Linea MAL FORMADA:\n    {0}\n", d);
                    continue;
                }
                Date f = Fecha.convertirHora(p[0]);
                String[] params = null;
                if (f != null) {
                    if (p.length > 2) {
                        params = Arrays.copyOfRange(p, 2, p.length);
                    }
                    ScriptUsuario su = new ScriptUsuario(p[1], f, p[0]);
                    su.params = params;
                    scriptsUsuario.add(su);
                }
            } else if (clave.startsWith("usuariohttp")) {
                String v = d.valor;
                if (v.indexOf(':') >= 0) {
                    usuariosAutorizados.add(d.valor);
                }
            }
        }
    }

    public void desactivarComprobacionMonitores() {
        comprobarMonitores = false;
    }

    public void activarComprobacionMonitores() {
        comprobarMonitores = true;
    }

    public class ScriptUsuario {

        public String path;
        public Date hora;
        public String strFecha;
        public String[] params;

        public ScriptUsuario(String path, Date hora, String strFecha) {
            this.path = path;
            this.hora = hora;
            this.strFecha = strFecha;
        }
    }
}
