from tkinter import messagebox
import mysql.connector
from vista import *
from validar import Validar
from tkinter.messagebox import*
from mysql.connector import Error


class Abmcmysql:
    """
    Esta es la clase principal
    """

    def __init__(
        self,
    ):
        """
        Esta función nos conecta con la base de datos y la tabla | Si alguna no existe entonces la crea.
        """
        try:
            self.validar = Validar()
            self.mibase = mysql.connector.connect(
                host="localhost",
                user="root",
                passwd="",
            )
        except:
            showerror("Error", "Verifique su conexión con la base de datos")
        self.micursor = self.mibase.cursor()
        self.micursor.execute("CREATE DATABASE IF NOT EXISTS covid_base")
        self.mibase = mysql.connector.connect(
            host="localhost",
            user="root",
            passwd="",
            database="covid_base"
        )
        self.micursor = self.mibase.cursor()
        self.micursor.execute("CREATE TABLE IF NOT EXISTS casos_covid(id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, nombre VARCHAR(128) COLLATE utf8_spanish2_ci NOT NULL, apellido varchar(128) COLLATE utf8_spanish2_ci NOT NULL, documento INT(128) COLLATE utf8_spanish2_ci NOT NULL,edad VARCHAR(128) COLLATE utf8_spanish2_ci NOT NULL,genero VARCHAR(128) COLLATE utf8_spanish2_ci NOT NULL,comuna VARCHAR(128) COLLATE utf8_spanish2_ci NOT NULL,contagio VARCHAR(128) COLLATE utf8_spanish2_ci NOT NULL,estado VARCHAR(128) COLLATE utf8_spanish2_ci NOT NULL)")
        self.sql_treeview = "SELECT id, nombre, apellido, documento, edad, genero, comuna, contagio, estado FROM casos_covid"

    def alta(self, nombre, apellido, documento, edad, genero, comuna, contagio, estado):
        """
        Esta función genera el alta del paciente, utilizando las validaciónes correspondientes (sin campos vacios y utilizando REGEX)
        """
        self.micursor.execute("SELECT documento FROM casos_covid")
        file_ids = [self.row[0]for self.row in self.micursor.fetchall()]
        is_in_list = documento.get()
        if not self.validar.valida_entry(nombre, apellido, documento, edad, genero, comuna, contagio, estado
                                         ):
            showerror("Error", "No pueden quedar campos vacios")

        else:
            if self.validar.valida_texto(nombre, apellido):
                showerror("Error", "Nombre/Apellido solo admite Letras")
            else:
                if int(is_in_list) in file_ids:
                    showerror("Error", "El documento ya existe en la base")
                else:
                    if self.validar.valida_numero(documento, edad):
                        showerror(
                            "Error", "Documento/Edad solo admite números")
                    else:
                        nuevo_paciente = (nombre.get(), apellido.get(), documento.get(
                        ), edad.get(), genero.get(), comuna.get(), contagio.get(), estado.get())
                        sql_treeview = "INSERT INTO casos_covid(nombre, apellido, documento, edad, genero, comuna, contagio, estado) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)"
                        self.micursor.execute(sql_treeview, nuevo_paciente)
                        self.mibase.commit()
                        showinfo("Tarea realizada",
                                 "Paciente dado de alta correctamente")

    def baja(self, clave):
        """
        Esta función elimina un registro de nuestra base
        """
        id = clave
        if messagebox.askyesno("Confirmación", "¿Está seguro que desea ELIMINAR al paciente "+id+"?"):
            sql_baja = "DELETE FROM casos_covid WHERE id = "+id
            self.micursor.execute(sql_baja)
            self.mibase.commit()
            showinfo("Tarea realizada", "Paciente dado de baja correctamente")
        else:
            pass

    def modificar(self, caja_nombre, caja_apellido, caja_documento, caja_edad,
                  genero_desplegable, comuna_desplegable, contagio_desplegable, estado_desplegable, caja_id):
        """
        Esta función modifica un registro previamente cargado (antes habiendolo seleccionado en el treeview).
        """
        if messagebox.askyesno("Confirmación", "¿Está seguro que desea modificar este paciente?"):
            sql_modificar = "UPDATE casos_covid SET nombre = %s, apellido = %s, documento = %s, edad = %s, genero = %s, comuna = %s, contagio =%s, estado= %s WHERE id =%s"
            datos = [caja_nombre.get(), caja_apellido.get(), caja_documento.get(), caja_edad.get(), genero_desplegable.get(
            ), comuna_desplegable.get(), contagio_desplegable.get(), estado_desplegable.get(), caja_id.get()]
            self.micursor.execute(sql_modificar, datos)
            self.mibase.commit()
            showinfo("Tarea realizada", "Paciente actualizado correctamente")

    def limpiar(self, caja_id, caja_nombre, caja_apellido, caja_documento, caja_edad,
                comuna_desplegable, genero_desplegable, contagio_desplegable, estado_desplegable):
        """
        Esta función limpia los campos a completar.
        """
        caja_id["state"] = "normal"
        caja_id.delete(0, END)
        caja_id["state"] = "disabled"
        caja_nombre.delete(0, END)
        caja_apellido.delete(0, END)
        caja_nombre.delete(0, END)
        caja_apellido.delete(0, END)
        caja_documento["state"] = "normal"
        caja_documento.delete(0, END)
        caja_edad.delete(0, END)
        comuna_desplegable.set("")
        genero_desplegable.set("")
        contagio_desplegable.set("")
        contagio_desplegable.set("")
        estado_desplegable.set("")

    def seleccionar(self, event, trv, caja_documento, t1, t2, t3, t4, t5, t6, t7, t9, t10):
        """

        Esta función se utiliza para poder manipular los registros en el treeview seleccionandolos, para luego hacer la baja/modificación.

        """
        self.rowid = trv.identify_row(event.y)
        self.item = trv.item(trv.focus())
        caja_documento["state"] = "readonly"
        self.item = trv.item(trv.focus())
        t1.set(self.item['values'][0])
        t2.set(self.item['values'][1])
        t3.set(self.item['values'][2])
        t4.set(self.item['values'][3])
        t5.set(self.item['values'][4])
        t6.set(self.item['values'][5])
        t7.set(self.item['values'][6])
        t9.set(self.item['values'][7])
        t10.set(self.item['values'][8])

from tkinter import messagebox
import mysql.connector
from vista import *
from validar import Validar
from tkinter.messagebox import*
from mysql.connector import Error


class Abmcmysql:
    """
    Esta es la clase principal
    """

    def __init__(
        self,
    ):
        """
        Esta función nos conecta con la base de datos y la tabla | Si alguna no existe entonces la crea.
        """
        try:
            self.validar = Validar()
            self.mibase = mysql.connector.connect(
                host="localhost",
                user="root",
                passwd="",
            )
        except:
            showerror("Error", "Verifique su conexión con la base de datos")
        self.micursor = self.mibase.cursor()
        self.micursor.execute("CREATE DATABASE IF NOT EXISTS covid_base")
        self.mibase = mysql.connector.connect(
            host="localhost",
            user="root",
            passwd="",
            database="covid_base"
        )
        self.micursor = self.mibase.cursor()
        self.micursor.execute("CREATE TABLE IF NOT EXISTS casos_covid(id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, nombre VARCHAR(128) COLLATE utf8_spanish2_ci NOT NULL, apellido varchar(128) COLLATE utf8_spanish2_ci NOT NULL, documento INT(128) COLLATE utf8_spanish2_ci NOT NULL,edad VARCHAR(128) COLLATE utf8_spanish2_ci NOT NULL,genero VARCHAR(128) COLLATE utf8_spanish2_ci NOT NULL,comuna VARCHAR(128) COLLATE utf8_spanish2_ci NOT NULL,contagio VARCHAR(128) COLLATE utf8_spanish2_ci NOT NULL,estado VARCHAR(128) COLLATE utf8_spanish2_ci NOT NULL)")
        self.sql_treeview = "SELECT id, nombre, apellido, documento, edad, genero, comuna, contagio, estado FROM casos_covid"

    def alta(self, nombre, apellido, documento, edad, genero, comuna, contagio, estado):
        """
        Esta función genera el alta del paciente, utilizando las validaciónes correspondientes (sin campos vacios y utilizando REGEX)
        """
        self.micursor.execute("SELECT documento FROM casos_covid")
        file_ids = [self.row[0]for self.row in self.micursor.fetchall()]
        is_in_list = documento.get()
        if not self.validar.valida_entry(nombre, apellido, documento, edad, genero, comuna, contagio, estado
                                         ):
            showerror("Error", "No pueden quedar campos vacios")

        else:
            if self.validar.valida_texto(nombre, apellido):
                showerror("Error", "Nombre/Apellido solo admite Letras")
            else:
                if int(is_in_list) in file_ids:
                    showerror("Error", "El documento ya existe en la base")
                else:
                    if self.validar.valida_numero(documento, edad):
                        showerror(
                            "Error", "Documento/Edad solo admite números")
                    else:
                        nuevo_paciente = (nombre.get(), apellido.get(), documento.get(
                        ), edad.get(), genero.get(), comuna.get(), contagio.get(), estado.get())
                        sql_treeview = "INSERT INTO casos_covid(nombre, apellido, documento, edad, genero, comuna, contagio, estado) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)"
                        self.micursor.execute(sql_treeview, nuevo_paciente)
                        self.mibase.commit()
                        showinfo("Tarea realizada",
                                 "Paciente dado de alta correctamente")

    def baja(self, clave):
        """
        Esta función elimina un registro de nuestra base
        """
        id = clave
        if messagebox.askyesno("Confirmación", "¿Está seguro que desea ELIMINAR al paciente "+id+"?"):
            sql_baja = "DELETE FROM casos_covid WHERE id = "+id
            self.micursor.execute(sql_baja)
            self.mibase.commit()
            showinfo("Tarea realizada", "Paciente dado de baja correctamente")
        else:
            pass

    def modificar(self, caja_nombre, caja_apellido, caja_documento, caja_edad,
                  genero_desplegable, comuna_desplegable, contagio_desplegable, estado_desplegable, caja_id):
        """
        Esta función modifica un registro previamente cargado (antes habiendolo seleccionado en el treeview).
        """
        if messagebox.askyesno("Confirmación", "¿Está seguro que desea modificar este paciente?"):
            sql_modificar = "UPDATE casos_covid SET nombre = %s, apellido = %s, documento = %s, edad = %s, genero = %s, comuna = %s, contagio =%s, estado= %s WHERE id =%s"
            datos = [caja_nombre.get(), caja_apellido.get(), caja_documento.get(), caja_edad.get(), genero_desplegable.get(
            ), comuna_desplegable.get(), contagio_desplegable.get(), estado_desplegable.get(), caja_id.get()]
            self.micursor.execute(sql_modificar, datos)
            self.mibase.commit()
            showinfo("Tarea realizada", "Paciente actualizado correctamente")

    def limpiar(self, caja_id, caja_nombre, caja_apellido, caja_documento, caja_edad,
                comuna_desplegable, genero_desplegable, contagio_desplegable, estado_desplegable):
        """
        Esta función limpia los campos a completar.
        """
        caja_id["state"] = "normal"
        caja_id.delete(0, END)
        caja_id["state"] = "disabled"
        caja_nombre.delete(0, END)
        caja_apellido.delete(0, END)
        caja_nombre.delete(0, END)
        caja_apellido.delete(0, END)
        caja_documento["state"] = "normal"
        caja_documento.delete(0, END)
        caja_edad.delete(0, END)
        comuna_desplegable.set("")
        genero_desplegable.set("")
        contagio_desplegable.set("")
        contagio_desplegable.set("")
        estado_desplegable.set("")

    def seleccionar(self, event, trv, caja_documento, t1, t2, t3, t4, t5, t6, t7, t9, t10):
        """

        Esta función se utiliza para poder manipular los registros en el treeview seleccionandolos, para luego hacer la baja/modificación.

        """
        self.rowid = trv.identify_row(event.y)
        self.item = trv.item(trv.focus())
        caja_documento["state"] = "readonly"
        self.item = trv.item(trv.focus())
        t1.set(self.item['values'][0])
        t2.set(self.item['values'][1])
        t3.set(self.item['values'][2])
        t4.set(self.item['values'][3])
        t5.set(self.item['values'][4])
        t6.set(self.item['values'][5])
        t7.set(self.item['values'][6])
        t9.set(self.item['values'][7])
        t10.set(self.item['values'][8])

Esta es la clase principal Esta función nos conecta con la base de datos y la tabla | Si alguna no existe entonces la crea. Esta función genera el alta del paciente, utilizando las validaciónes correspondientes (sin campos vacios y utilizando REGEX) Esta función elimina un registro de nuestra base Esta función modifica un registro previamente cargado (antes habiendolo seleccionado en el treeview). Esta función limpia los campos a completar. Esta función se utiliza para poder manipular los registros en el treeview seleccionandolos, para luego hacer la baja/modificación.