/* 
* 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.datos;

import java.sql.*;
import java.util.logging.Level;
import servidor.*;
import servidor.clientes.Operador;
import servidor.comunicaciones.*;
import servidor.datos.base.*;
import servidor.utiles.*;

public class TablaAcciones extends MemTablaAcciones {

    public TablaOperadores tablaOperadores;

    public TablaAcciones() {
    }

    public RegistroAcciones buscar(Operador op) {
        return buscar(op.getPuesto(), op.getNombre());
    }

    public RegistroAcciones buscar(String puesto, String nombre) {
        for (int i = 0; i < filas.size(); i++) {
            RegistroAcciones reg = this.registro(i);
            if (reg.getPuesto().equals(puesto) && reg.getCodigo().equalsIgnoreCase(nombre)) {
                return reg;
            }
        }
        return null;
    }

    public RegistroAcciones primeraConexion(String puesto, String nombre, String centro) {
        String turno = Global.main.getTurno();
        RegistroAcciones reg = null;
        try {
            Timestamp ahora = Fecha.ahora();
            boolean insertar = false;
            if ((reg = buscar(puesto, nombre)) == null) {
                insertar = true;
                reg = (RegistroAcciones) this.nuevoRegistro();
                reg.setPuesto(puesto);
                reg.setCodigo(nombre);
                reg.setTurno(turno);
                reg.setFechaConexion(ahora);

            }
            reg.setHoraUltimoMovimiento(ahora);
            reg.setEstado("1");
            if (centro.equals(" ")) {
                centro = Configuracion.getConfiguracion().codigoCentro;
            }
            reg.setCentro(centro);
            if (insertar) {
                insert(reg);
            } else {
                update(reg);
            }
        } catch (Exception exc) {
            servidor.ServidorMain.log.log(Level.WARNING, "{0} : {1}-{2};{3};{4}", new Object[]{exc.getMessage(), puesto, nombre, turno, centro});
        }
        return reg;
    }

    public RegistroAcciones cambiaEstado(MensajeOperador msg, int estado) throws Exception {
        int codigo = msg.getCodigo();
        String puesto = msg.getMesa();
        String operador = msg.getOperador();
        int segundos = msg.getIntParam(3);
        RegistroAcciones reg = null;
        if ((reg = buscar(puesto, operador)) == null) {
            RegistroOperadores op = tablaOperadores.buscarCodigo(operador);
            primeraConexion(puesto, operador, op.getCentro());
            if ((reg = buscar(puesto, operador)) == null) {
                throw new Exception("Operador no encontrado y no añadido: " + puesto + "/" + operador);
            }
        }

        switch (codigo) {
            case MensajeOperador.ESTADO_INICIO:
                reg.setTiempoOcupado(reg.getTiempoOcupado() + segundos);
                break;
            case MensajeOperador.ESTADO_DESCANSO_A_LIBRE:
                reg.setTiempoDescanso(reg.getTiempoDescanso() + segundos);
                break;
            case MensajeOperador.ESTADO_TRABAJO_A_TRABAJO:
            case MensajeOperador.ESTADO_TRABAJO_A_LIBRE:
            case MensajeOperador.ESTADO_TRABAJO_A_DESCANSO:
                reg.setTiempoOcupado(reg.getTiempoOcupado() + segundos);
                reg.setCitas(reg.getCitas() + msg.getNumCitas());
                break;
            default:
                reg.setTiempoLibre(reg.getTiempoLibre() + segundos);
        }
        reg.setEstado(String.valueOf(estado));
        reg.setHoraUltimoMovimiento(Fecha.ahora());
        update(reg);
        return reg;
    }

    public RegistroAcciones cambiaEstado(String puesto, String operador, int numeroCitas, int estado, String cola) throws SQLException {
        RegistroAcciones reg;
        if ((reg = buscar(puesto, operador)) == null) {
            RegistroOperadores op = tablaOperadores.buscarCodigo(operador);
            primeraConexion(puesto, operador, op.getCentro());
            if ((reg = buscar(puesto, operador)) == null) {
                throw new SQLException("Operador no encontrado y no añadido: " + puesto + "/" + operador);
            }
        }
        reg.setEstado(String.valueOf(estado));
        reg.setHoraUltimoMovimiento(Fecha.ahora());
        if (estado == Operador.ENTRANSITO) {
            reg.setCitaMultiple(numeroCitas);
            reg.setCola(cola);
        }
        update(reg);
        return reg;
    }

    public void ponerTodosACero() {
        try {
            BaseDatos.bd().SQL("UPDATE AccionesHoy SET estado='0'");
            recargar();
        } catch (Exception exc) {
            servidor.ServidorMain.log.log(Level.WARNING, "ERROR al poner estado a CERO en Tabla AccionesHoy:\n{0}", exc.getMessage());
        }
    }

    public int mayorNumeroMesa() {
        int valor = 0;
        for (int i = 0; i < filas.size(); i++) {
            RegistroAcciones reg = registro(i);
            int actual = Integer.parseInt(reg.getPuesto());
            if (actual > valor) {
                valor = actual;
            }
        }
        return valor;
    }
}
