// 
// 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.
// 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using minigestor.datos;
using ateneo.utiles;
using gestor.utiles;

namespace minigestor
{
    public partial class FormNuevoCandidato : Form
    {
        Configuracion conf = null;
        TablaColas colas;
        TablaCandidatos candidatos;
        Comunicaciones comm;
        Font fuenteBotonesCola = new Font("Tahoma", 15f, FontStyle.Regular);
        RadioButton rbInvisible;
        RadioButton rbInvisible2;
        string nif;
        string nombre;
        string letraCola;
        string descripcionCola;
        DateTime hora = Fecha.fechaVacia;
        MiniGestor gestor;

        public FormNuevoCandidato(MiniGestor minigestor) {
            conf = Configuracion.instanciaUnica;
            colas = TablaColas.getTablaColas();
            candidatos = TablaCandidatos.getTablaCandidatos();
            gestor = minigestor;
            comm = gestor.comunicaciones;
            InitializeComponent();
            this.BackColor = Global.colorApp;
            crearColas();
        }

        private void crearColas() {
            SortedDictionary<string, RegistroCola> colasValidas = new SortedDictionary<string, RegistroCola>();
            SortedDictionary<string, RegistroCola> colasValidasEsp = new SortedDictionary<string, RegistroCola>();
            try {
                foreach (RegistroCola cola in colas) {
                    if (cola.activa) {
                        if (cola.colaespecial == false) {
                            colasValidas.Add(cola.cola, cola);
                        } else {
                            colasValidasEsp.Add(cola.cola, cola);
                        }
                    }
                }
                foreach (RegistroCola cola in colasValidas.Values) {
                    RadioButton boton = nuevoBotonCola(cola);
                    if (cola.cerrada) {
                        boton.Enabled = false;
                    }
                }
                ((MiRadioButton)panelColas.Controls[0]).interesado = true;
                if (colasValidasEsp.Count == 0) {
                    tabPanel.TabPages.RemoveAt(1);
                } else {
                    foreach (RegistroCola cola in colasValidasEsp.Values) {
                        RadioButton boton = nuevoBotonColaEspecial(cola);
                        if (cola.cerrada) {
                            boton.Enabled = false;
                        }
                    }
                    ((MiRadioButton)panelColasEspeciales.Controls[0]).interesado = true;
                }
                rbInvisible = new RadioButton();
                panelColas.Controls.Add(rbInvisible);
                rbInvisible.Visible = false;
                rbInvisible2 = new RadioButton();
                panelColasEspeciales.Controls.Add(rbInvisible2);
                rbInvisible2.Visible = false;
            } catch (Exception exc) {
                LogExcepcion.guardar("Error al formar botones de seleccion de cola", exc);
            }
        }

        private RadioButton nuevoBotonCola(RegistroCola rc) {
            try {
                MiRadioButton cola = new MiRadioButton();
                cola.Size = new Size(panelColas.Width / 2 - 8, 24);
                cola.setText(rc.cola, rc.descripcion);
                cola.Font = fuenteBotonesCola;
                cola.Margin = new Padding(8, 0, 0, 0);
                cola.UseCompatibleTextRendering = true;
                cola.KeyDown += new KeyEventHandler(cola_KeyDown);
                cola.KeyUp += new KeyEventHandler(cola_KeyUp);
                cola.CheckedChanged += new EventHandler(cola_CheckedChanged);
                panelColas.Controls.Add(cola);
                return cola;
            } catch (Exception e) {
                MessageBox.Show(e.Message + "\n" + e.StackTrace);
            }
            return null;
        }

        private RadioButton nuevoBotonColaEspecial(RegistroCola rc) {
            try {
                MiRadioButton cola = new MiRadioButton();
                cola.setText(rc.cola, rc.descripcion);
                cola.Size = new Size(panelColas.Width - 16, 24);
                cola.Font = fuenteBotonesCola;
                cola.Margin = new Padding(8, 1, 1, 1);
                cola.UseCompatibleTextRendering = true;
                cola.CheckedChanged += new EventHandler(cola_CheckedChanged);
                panelColasEspeciales.Controls.Add(cola);
                return cola;
            } catch (Exception e) {
                MessageBox.Show(e.Message + "\n" + e.StackTrace);
            }
            return null;
        }

        void cola_CheckedChanged(object sender, EventArgs e) {
            guardarColaSeleccionada(sender as MiRadioButton);
        }

        private void guardarColaSeleccionada(MiRadioButton botonCola) {
            letraCola = botonCola.cola;
            descripcionCola = botonCola.descripcion;
        }

        void cola_KeyUp(object sender, KeyEventArgs e) {
            buscaColaTeclaPulsada(e);
        }

        void cola_KeyDown(object sender, KeyEventArgs e) {
            // solo se debe llegar aqui en el caso de los botones especialmente marcados para ello
            edNombre.Focus();
        }

        internal void cambiarEstadoCola(string codCola, bool cerrada) {
            Panel panel;
            if (codCola.Length == 1) {
                panel = panelColas;
            } else {
                panel = panelColasEspeciales;
            }
            foreach (Control c in panel.Controls) {
                MiRadioButton cola = c as MiRadioButton;
                if (cola.cola == codCola) {
                    cola.Enabled = !cerrada;
                    return;
                }
            }
        }

        private void buscaColaTeclaPulsada(KeyEventArgs e) {
            char c = (char)e.KeyValue;
            if (Char.IsLetter(c)) {
                c = Char.ToUpper(c);
                buscaColaTeclaPulsada(c);
            }
        }

        private void buscaColaTeclaPulsada(char c) {
            try {
                foreach (Control con in panelColas.Controls) {
                    MiRadioButton cola = con as MiRadioButton;
                    string nombreCola = cola.Text;
                    if (nombreCola.Length > 0 && c == nombreCola[0] && cola.Enabled) {
                        cola.Focus();
                        cola.Checked = true;
                        guardarColaSeleccionada(cola);
                        return;
                    }
                }
            } catch {
                // NO queremos hacer nada si no se encuentra la cola de la tecla pulsada
                // digamos que es intrascendente
            }
        }

        public void borraCampos() {
            edNif.Clear();
            edNombre.Clear();
            hora = Fecha.fechaVacia;
            quitarSeleccion();
            edNif.Focus();
        }

        public void clonarTiquet(string nif, string nombre) {
            edNif.Text = nif;
            edNombre.Text = nombre;
        }

        private void quitarSeleccion() {
            letraCola = null;
            rbInvisible.Focus();
            rbInvisible.Checked = true;
            rbInvisible2.Focus();
            rbInvisible2.Checked = true;
        }

        void mandarPeticion() {
            if (!validarDatos() || !confirmarEnvio()) {
                return;
            }
            string horaStr = Fecha.javaTimeStamp(DateTime.Now);
            comm.enviar(COD_ENVIADO.ENVIO_NUEVO_CANDIDATO, gestor.numeroGestor,
                    nif, nombre, horaStr, letraCola, "S");
            borraCampos();
            this.Hide(); ;
        }

        private bool confirmarEnvio() {
            string mensaje = "Confirme emisión de tique para la cola: \n" + descripcionCola;
            DialogResult dr = MessageBox.Show(mensaje, "NUEVO TIQUE", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            return (dr == DialogResult.Yes);
        }

    //    private const int GRABARCITA_ERROR_MANTENERDATOS = 0;
    //    private const int GRABARCITA_OK = 1;
    //    private const int GRABARCITA_TIQUET_MANUAL = 2;

    //    int grabarCita(RegistroCola cola) {
    //        if (letraCola == null) {
    //            MessageBox.Show("Debe seleccionar una cola");
    //            return GRABARCITA_ERROR_MANTENERDATOS;
    //        }
    //        nif = edNif.Text.Trim();
    //        if (nif.Length < 1 || !Global.nifValido(nif)) {
    //            MessageBox.Show("NIF inválido");
    //            edNif.Focus();
    //            return GRABARCITA_ERROR_MANTENERDATOS;
    //        }
    //        nif = formatoNif(nif);
    //        nombre = edNombre.Text.Trim();
    //        if (cola.necesitaApellido() && nombre.Length < 3) {
    //            MessageBox.Show("Nombre inválido");
    //            edNombre.Focus();
    //            return GRABARCITA_ERROR_MANTENERDATOS;
    //        }
    //        RegistroCandidatos regP = candidatos.buscarPorNifPresente(nif);
    //        if (regP != null) {
    //            MessageBox.Show(nif + " -- " + regP.nombre + "  tiene el tique " + regP.numeroTicket + " pendiente de ser atendido\n No se admite nueva Reserva");
    //            return GRABARCITA_OK;
    //        }
    //        regP = candidatos.buscarPorNifyCola(nif, letraCola);
    //        if (regP != null) {
    //            MessageBox.Show(nif + " -- " + regP.nombre + "  YA tiene cita concertada para la cola: " + letraCola + "\n No se admite nueva Reserva");
    //            return GRABARCITA_OK;
    //        }

    //        RegistroHuecos[] regs = Global.gestorMain.huecos.buscarDisponibles(letraCola, DateTime.Now);
    //        bool todosFueraDeTurno = Global.gestorMain.huecos.todosFueraDeTurno(regs);
    //        if (todosFueraDeTurno) {
    //            if (Global.respCitasTurnoTarde.val != null) {
    //                todosFueraDeTurno = Global.respCitasTurnoTarde.val == "S" ? false : true;
    //            } else {
    //                FormMensajeConRecuerdo anulable = new FormMensajeConRecuerdo(Global.respCitasTurnoTarde);
    //                anulable.rotulo = "SÓLO quedan huecos para el turno de TARDE\r\n" +
    //                        "¿Quiere seleccionar uno de ellos ?";
    //                if(anulable.ShowDialog() == DialogResult.Yes) {
    //                    todosFueraDeTurno = false;
    //                }
    //                anulable.Dispose();
    //            }
    //        }
    //        if (regs == null || regs.Length == 0 || todosFueraDeTurno) {
    //            if (Global.respTiketManual.val != null) {
    //                if (Global.respTiketManual.val == "S") {
    //                    return GRABARCITA_TIQUET_MANUAL;
    //                } else {
    //                    MessageBox.Show("No hay huecos disponibles para el servicio solicitado");
    //                    return GRABARCITA_OK;
    //                }
    //            }
    //            FormMensajeConRecuerdo anulable = new FormMensajeConRecuerdo(Global.respTiketManual);
    //            anulable.rotulo = "No quedan huecos disponibles para el servico solicitado\r\n" +
    //                    "¿Tiene autorización para emitir un tique sin reserva de hueco?";
    //            if (anulable.ShowDialog() == DialogResult.Yes) {
    //                return GRABARCITA_TIQUET_MANUAL;
    //            } else {
    //                return GRABARCITA_OK;
    //            }
    //        }
    //        FormOfrecerCitas dlgCitas = new FormOfrecerCitas();
    //        dlgCitas.cargar(regs, "Cola " + letraCola + ":  " + cola.descripcion);
    //        dlgCitas.ShowDialog();
    //        RegistroHuecos regHuecos = dlgCitas.regSeleccionado;
    //        if (regHuecos != null) {
    //            comm.enviar(COD_ENVIADO.ENVIO_NUEVO_CANDIDATO_NOPRESENTE, Global.gestorMain.numeroGestor,
    //                    nif, nombre, Fecha.javaTimeStamp(regHuecos.horaCita), letraCola);
    //            hora = regHuecos.horaCita;
    //        }
    //        dlgCitas.Dispose();
    //        return GRABARCITA_OK;
    //    }


        private string formatoNif(string nif) {
            if (nif.Length < 2) {
                return "XXX";
            }
            if (nif.StartsWith("XXX")) {
                return nif;
            }
            if (nif.StartsWith("#"))
            {
                return nif;
            }
            if (nif.Length < 9) {
                nif = new string('0', 9 - nif.Length) + nif;
            }
            return nif;
        }

        private void tabPanel_SelectedIndexChanged(object sender, EventArgs e) {
            quitarSeleccion();
        }

        bool validarDatos() {
           // nif = formatoNif(edNif.Text.ToUpper());
            nif = edNif.Text.ToUpper();
            if (conf.permitirNoiden == false)
            {
                if (edNif.Text.Trim()[0] == '#')
                {
                    MessageBox.Show("Error en Identificación fiscal");
                    edNif.Focus();
                    return false;
                }
            }
            if (nif.StartsWith("#") && nif.Length < 9)
            {
                MessageBox.Show("Error Identificación fiscal, minimo 9 caracteres");
                
                return false;
            }
            if (edNif.Text.Trim().Length > 16)
            {
                MessageBox.Show("Error en Identificación fiscal");
                edNif.Focus();

                return false;
            }
            if (letraCola == null) {
                MessageBox.Show("Debe seleccionar una cola");
                return false;
            }
            RegistroCola reg = colas.buscar(letraCola);
            if (reg.nifObligatorio || nif.Length > 0) {
                this.Cursor = Cursors.WaitCursor;
                if (!Global.nifValido(nif)) {
                    MessageBox.Show("Error Identificación fiscal");
                    edNif.Focus();
                    this.Cursor = Cursors.Default;
                    return false;
                }
                this.Cursor = Cursors.WaitCursor;
            }
            nombre = edNombre.Text.Trim();
            if (nombre.Length < 1) {
                nombre = " ";
             }
            if (nombre.Length > 39)
            {
                nombre = nombre.Substring(0,38);
            }

            return true;
        }

        private void edNif_KeyDown(object sender, KeyEventArgs e) {
            if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Down) {
                edNombre.Focus();
                e.Handled = true;
            }
        }

        private void edNombre_KeyDown(object sender, KeyEventArgs e) {
            if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Down) {
                tabPanel.SelectedTab.Controls[0].Controls[0].Focus();
                e.Handled = true;
            } else if (e.KeyCode == Keys.Up) {
                edNif.Focus();
                e.Handled = true;
            }
        }

        private void edNif_KeyPress(object sender, KeyPressEventArgs e) {
            char c = e.KeyChar;
             if (c == '#') return;
            if (Char.IsLetter(c) && edNif.Text.Length > 2) {
                string nifABuscar = edNif.Text + Char.ToString(c).ToUpper();
                edNombre.Text = TablaCandidatos.getTablaCandidatos().buscarNombrePorNif(nifABuscar);
            }
        }

        private void btSolicitarTique_Click(object sender, EventArgs e) {
            mandarPeticion();
        }

        private void btCerrar_Click(object sender, EventArgs e) {
            this.Hide();
        }

    }

    public class MiRadioButton : RadioButton
    {
        public bool interesado = false;
        public string cola;
        public string descripcion;

        public MiRadioButton()
            : base() {
            this.UseCompatibleTextRendering = true;
        }

        public void setText(string co, string desc) {
            Text = co + "-" + desc;
            cola = co;
            descripcion = desc;
        }

        protected override bool IsInputKey(Keys keyData) {
            if (keyData == Keys.Up && interesado) {
                return true;
            }
            return base.IsInputKey(keyData);
        }
    }
}