import tkinter as tk
from tkinter import ttk
from tkinter import StringVar
import sqlitecloud as DbTool
#import sqlite3 as sq3

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Gestión de Impuestos")
        self.geometry("1200x600")
        self.resizable(False, False)
        self.ConnectionState="Desconectada"

        self.configure(bg="#f0f0f0")
        
        # Crear menú lateral
        self.menu_lateral = tk.Frame(self, bg="#2c3e50", width=200)
        self.menu_lateral.pack(side="left", fill="y")

        # Área de contenido principal
        self.area_contenido = tk.Frame(self, bg="#ecf0f1")
        self.area_contenido.pack(side="right", expand=True, fill="both")

        # Diccionario para las páginas
        self.paginas = {}

        # Crear botones del menú
        opciones = [
            ("Configuraciones", self.mostrar_configuraciones),
            ("Contribuyentes", self.mostrar_contribuyentes),
            ("Retenciones", self.mostrar_retenciones),
            ("Ingresos", self.mostrar_ingresos),
            ("Crédito IVA", self.mostrar_credito_iva),
            ("Reportes", self.mostrar_reportes),
            ("Salir", self.salir_aplicacion)
        ]

        for texto, comando in opciones:
            b = tk.Button(self.menu_lateral, text=texto, command=comando,
                          bg="#34495e", fg="white", font=("Arial", 10), bd=0, pady=10)
            b.pack(fill="x")

        # Mostrar la primera vista por defecto
        self.mostrar_configuraciones()

    # Método para conectar a la base de datos
    def ConnectToDb(self):
        iPath='sqlitecloud://cgj5hqvphk.g6.sqlite.cloud:8860/TaxManager?apikey=IrbKQfh6gQXUIE3AzTyWWZnb5fIgXNt8nsbMZ24V72g'
        #iPath='/home/yesly/Documentos/Proyectos/VscSpace/TaxManager/TaxManager'
        try:
            self.iConnection=DbTool.connect(iPath)
            self.iCursor=self.iConnection.cursor()
            self.ConnectionState="Conectada"
        except:
            pass

    def CloseConnectionToDb(self):
        # Se intenta cerrar la conexión si está abierta
        if self.ConnectionState=="Conectada":
            try:
                self.iCursor.close()
                self.iConnection.close()
            except:
                pass

    def limpiar_contenido(self):
        for widget in self.area_contenido.winfo_children():
            widget.destroy()

    # Funciones para mostrar cada vista
    def mostrar_configuraciones(self):
        self.limpiar_contenido()

        # Menú horizontal de pestañas
        menu_config = tk.Frame(self.area_contenido, bg="#bdc3c7")
        menu_config.pack(fill="x", pady=(0, 10))

        opciones_config = [
            ("Entidades", self.mostrar_config_entidades),
            ("Período", self.mostrar_config_periodo),
            ("Retenciones", self.mostrar_config_retenciones),
            ("Ingresos", self.mostrar_config_ingresos),
            ("Crédito IVA", self.mostrar_config_credito)
        ]

        for texto, comando in opciones_config:
            b = tk.Button(menu_config, text=texto, command=comando,
                        bg="#95a5a6", fg="white", font=("Arial", 10), bd=0, padx=20, pady=5)
            b.pack(side="left", padx=2)
        
        # Área donde se cargará el contenido de la subconfiguración
        self.sub_contenido = tk.Frame(self.area_contenido, bg="#ecf0f1")
        self.sub_contenido.pack(expand=True, fill="both")

        # Mostrar vista por defecto
        self.mostrar_config_entidades()

    def limpiar_subcontenido(self):
        for widget in self.sub_contenido.winfo_children():
            widget.destroy()

    def mostrar_config_entidades(self):
        self.limpiar_subcontenido()

        # Frame contenedor para el formulario
        formulario_frame = tk.LabelFrame(self.sub_contenido, text='Datos de la Entidad', bg="#ecf0f1")
        formulario_frame.pack(fill="x", padx=20, pady=10)

        formulario = tk.Frame(formulario_frame, bg="#ecf0f1")
        formulario.pack(anchor="w")

        tk.Label(formulario, text="ID:", font=("Arial", 12), bg="#ecf0f1").grid(row=0, column=0, sticky="w", padx=5, pady=5)
        self.ent_id = tk.Entry(formulario, width=30)
        self.ent_id.grid(row=0, column=1, pady=5, sticky="w")

        tk.Label(formulario, text="Nombre:", font=("Arial", 12), bg="#ecf0f1").grid(row=1, column=0, sticky="w", padx=5, pady=5)
        self.ent_nombre = tk.Entry(formulario, width=30)
        self.ent_nombre.grid(row=1, column=1, pady=5, sticky="w")

        # === Botones de acción ===
        botones = tk.Frame(formulario, bg="#ecf0f1")
        botones.grid(row=2, column=0, columnspan=2, pady=10, sticky="w")

        tk.Button(botones, text="Agregar", width=12, command=self.agregar_entidad).grid(row=0, column=0, padx=5)
        tk.Button(botones, text="Cancelar", width=12, command=self.cancelar_entidad).grid(row=0, column=1, padx=5)
        tk.Button(botones, text="Editar", width=12, command=self.editar_entidad).grid(row=0, column=2, padx=5)
        tk.Button(botones, text="Eliminar", width=12, command=self.eliminar_entidad).grid(row=0, column=3, padx=5)

        # === Tabla para mostrar entidades ===
        tabla_frame = tk.Frame(self.sub_contenido)
        tabla_frame.pack(fill="both", expand=True, padx=20, pady=10)

        self.tabla_entidades = ttk.Treeview(tabla_frame, columns=("id", "nombre"), show="headings")
        self.tabla_entidades.heading("id", text="ID")
        self.tabla_entidades.heading("nombre", text="Nombre")
        self.tabla_entidades.column("id", width=30)
        self.tabla_entidades.column("nombre", width=900)
        self.tabla_entidades.pack(fill="both", expand=True)

        # Se establece conexión con la base de datos
        self.ConnectToDb()

        # Obteniendo los datos de la tabla entidades
        iSql="SELECT * FROM entidades"
        DataInfo=self.iCursor.execute(iSql)
        Rst=DataInfo.fetchall()
        # Encontrando el próximo Id
        if len(Rst)!=0:
            MaxId=max(a[0] for a in Rst)
            NextId=MaxId+1
        else:
            NextId=1
            
        self.ent_id.delete(0, tk.END)
        self.ent_id.insert(0, NextId)
        self.ent_id.config(state="readonly")
        
        # Se imprime la lista de entidades en la tabla
        for b in Rst:
            self.tabla_entidades.insert("", "end", values=b)

        # Evento para seleccionar fila
        self.tabla_entidades.bind("<<TreeviewSelect>>", self.seleccionar_entidad)

        # Cerrando conexión con la base de datos
        self.CloseConnectionToDb()
    
    def agregar_entidad(self):
        id_valor = self.ent_id.get().strip()
        nombre_valor = self.ent_nombre.get().strip()
        # Línea de registro
        iRow=[(id_valor, nombre_valor)]
        # Registrando datos en la base de datos
        self.ConnectToDb()
        #self.iCursor.execute("INSERT INTO entidades VALUES(NULL, '{}')".format(nombre_valor));
        self.iCursor.executemany("INSERT INTO entidades VALUES(?, ?)", iRow)
        self.iConnection.commit()
        # Imprimiendo datos en la tabla
        if id_valor and nombre_valor:
            self.tabla_entidades.insert("", "end", values=(id_valor, nombre_valor))
            self.ent_id.config(state="normal")
            self.ent_id.delete(0, tk.END)
            self.ent_id.insert(0, int(id_valor)+1)
            self.ent_id.config(state="readonly")
            self.ent_nombre.delete(0, tk.END)
        # Cerrando la conexión a la base de datos
        self.CloseConnectionToDb()

    def cancelar_entidad(self):
        # Conectando a la base de datos
        self.ConnectToDb()
        # Obteniendo el MaxId
        iSql="SELECT * FROM entidades"
        DataInfo=self.iCursor.execute(iSql)
        Rst=DataInfo.fetchall()
        if len(Rst)!=0:
            MaxId=max(a[0] for a in Rst)
            NextId=MaxId+1
        else:
            NextId=1

        self.ent_id.config(state="normal")
        self.ent_id.delete(0, tk.END)
        self.ent_id.insert(0, NextId)
        self.ent_id.config(state="readonly")
        self.ent_nombre.delete(0, tk.END)
        # Cerrando conexión a la base de datos
        self.CloseConnectionToDb()

    def seleccionar_entidad(self, event):
        selected = self.tabla_entidades.focus()
        if selected:
            valores = self.tabla_entidades.item(selected, "values")
            if valores:
                self.ent_id.config(state="normal")
                self.ent_id.delete(0, tk.END)
                self.ent_id.insert(0, valores[0])
                self.ent_id.config(state="readonly")
                self.ent_nombre.delete(0, tk.END)
                self.ent_nombre.insert(0, valores[1])

    def editar_entidad(self):
        selected = self.tabla_entidades.focus()
        if selected:
            nuevo_id = self.ent_id.get().strip()
            nuevo_nombre = self.ent_nombre.get().strip()
            if nuevo_id and nuevo_nombre:
                self.tabla_entidades.item(selected, values=(nuevo_id, nuevo_nombre))
                self.cancelar_entidad()

    def eliminar_entidad(self):
        selected = self.tabla_entidades.focus()
        if selected:
            iRow=self.tabla_entidades.item(selected, "values")
            TargetId=iRow[0]
            # Conectando a la base de datos
            self.ConnectToDb()
            # Eliminando el registro de la base de datos
            iSql="DELETE FROM entidades WHERE id='{}'".format(TargetId)
            self.iCursor.execute(iSql)
            self.iConnection.commit()
            # Cerrando la conexión a la base de datos
            self.CloseConnectionToDb()
            self.tabla_entidades.delete(selected)
            self.cancelar_entidad()

    def mostrar_config_periodo(self):
        self.limpiar_subcontenido()

        # === Frame contenedor para el formulario ===
        formulario_frame = tk.Frame(self.sub_contenido, bg="#ecf0f1")
        formulario_frame.pack(anchor="w", padx=20, pady=10)

        formulario = tk.Frame(formulario_frame, bg="#ecf0f1")
        formulario.pack(anchor="w")

        # === Campo de selección de mes ===
        tk.Label(formulario, text="Mes:", font=("Arial", 12), bg="#ecf0f1").grid(row=0, column=0, sticky="w", padx=5, pady=5)
        self.combo_mes = ttk.Combobox(formulario, values=[
            "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
            "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"
        ], state="readonly", width=28)
        self.combo_mes.grid(row=0, column=1, pady=5, sticky="w")
        self.combo_mes.set("Seleccione un mes")

        # === Campo de selección de año ===
        tk.Label(formulario, text="Año:", font=("Arial", 12), bg="#ecf0f1").grid(row=1, column=0, sticky="w", padx=5, pady=5)
        self.combo_anio = ttk.Combobox(formulario, values=[str(a) for a in range(2020, 2031)],
                                    state="readonly", width=28)
        self.combo_anio.grid(row=1, column=1, pady=5, sticky="w")
        self.combo_anio.set("Seleccione el año")

        # === Botón Aplicar ===
        botones = tk.Frame(formulario, bg="#ecf0f1")
        botones.grid(row=2, column=0, columnspan=2, pady=10, sticky="w")

        tk.Button(botones, text="Aplicar", width=12, command=self.aplicar_periodo).grid(row=0, column=0, padx=5)

    def aplicar_periodo(self):
        mes = self.combo_mes.get()
        anio = self.combo_anio.get()
        # print(f"Período aplicado: {mes} {anio}")  # Puedes reemplazar esto con lógica real luego

    def mostrar_config_retenciones(self):
        self.limpiar_subcontenido()

        # === Frame contenedor del formulario ===
        formulario_frame = tk.Frame(self.sub_contenido, bg="#ecf0f1")
        formulario_frame.pack(anchor="w", padx=20, pady=10)

        formulario = tk.Frame(formulario_frame, bg="#ecf0f1")
        formulario.pack(anchor="w")

        # === Fila 1: ID, Código, Alícuota ===
        tk.Label(formulario, text="ID:", font=("Arial", 12), bg="#ecf0f1").grid(row=0, column=0, padx=5, pady=5, sticky="w")
        self.ret_id = tk.Entry(formulario, width=15)
        self.ret_id.grid(row=0, column=1, padx=5, pady=5)

        tk.Label(formulario, text="Código:", font=("Arial", 12), bg="#ecf0f1").grid(row=0, column=2, padx=5, pady=5, sticky="w")
        self.ret_codigo = tk.Entry(formulario, width=15)
        self.ret_codigo.grid(row=0, column=3, padx=5, pady=5)

        tk.Label(formulario, text="Tasa (%):", font=("Arial", 12), bg="#ecf0f1").grid(row=0, column=4, padx=5, pady=5, sticky="w")
        self.ret_aliquota = tk.Entry(formulario, width=15)
        self.ret_aliquota.grid(row=0, column=5, padx=5, pady=5)

        # === Fila 2: Descripción ===
        tk.Label(formulario, text="Descripción:", font=("Arial", 12), bg="#ecf0f1").grid(row=1, column=0, padx=5, pady=5, sticky="nw")
        self.ret_descripcion = tk.Text(formulario, width=75, height=3)
        self.ret_descripcion.grid(row=1, column=1, columnspan=5, padx=5, pady=5, sticky="w")

        # === Fila 3: Botones ===
        botones = tk.Frame(formulario, bg="#ecf0f1")
        botones.grid(row=2, column=0, columnspan=6, pady=10, sticky="w")

        tk.Button(botones, text="Agregar", width=12, command=self.agregar_retencion).grid(row=0, column=0, padx=5)
        tk.Button(botones, text="Editar", width=12, command=self.editar_retencion).grid(row=0, column=1, padx=5)
        tk.Button(botones, text="Eliminar", width=12, command=self.eliminar_retencion).grid(row=0, column=2, padx=5)
        tk.Button(botones, text="Cancelar", width=12, command=self.cancelar_retencion).grid(row=0, column=3, padx=5)

        # === Tabla para mostrar retenciones ===
        tabla_frame = tk.Frame(self.sub_contenido)
        tabla_frame.pack(fill="both", expand=True, padx=20, pady=10)

        self.tabla_retenciones = ttk.Treeview(tabla_frame, columns=("id", "descripcion", "tasa", "codigo"), show="headings")
        self.tabla_retenciones.heading("id", text="ID")
        self.tabla_retenciones.heading("descripcion", text="Descripción")
        self.tabla_retenciones.heading("tasa", text="Tasa %")
        self.tabla_retenciones.heading("codigo", text="Código")

        self.tabla_retenciones.column("id", width=50)
        self.tabla_retenciones.column("descripcion", width=600)
        self.tabla_retenciones.column("tasa", width=100)
        self.tabla_retenciones.column("codigo", width=100)

        self.tabla_retenciones.pack(fill="both", expand=True)

        # Evento para seleccionar fila
        self.tabla_retenciones.bind("<<TreeviewSelect>>", self.seleccionar_retencion)

    def agregar_retencion(self):
        id_valor = self.ret_id.get().strip()
        codigo = self.ret_codigo.get().strip()
        tasa = self.ret_aliquota.get().strip()
        descripcion = self.ret_descripcion.get("1.0", tk.END).strip()

        if id_valor and codigo and tasa and descripcion:
            self.tabla_retenciones.insert("", "end", values=(id_valor, descripcion, tasa, codigo))
            self.cancelar_retencion()

    def cancelar_retencion(self):
        self.ret_id.delete(0, tk.END)
        self.ret_codigo.delete(0, tk.END)
        self.ret_aliquota.delete(0, tk.END)
        self.ret_descripcion.delete("1.0", tk.END)

    def seleccionar_retencion(self, event):
        selected = self.tabla_retenciones.focus()
        if selected:
            valores = self.tabla_retenciones.item(selected, "values")
            if valores:
                self.ret_id.delete(0, tk.END)
                self.ret_id.insert(0, valores[0])
                self.ret_descripcion.delete("1.0", tk.END)
                self.ret_descripcion.insert("1.0", valores[1])
                self.ret_aliquota.delete(0, tk.END)
                self.ret_aliquota.insert(0, valores[2])
                self.ret_codigo.delete(0, tk.END)
                self.ret_codigo.insert(0, valores[3])

    def editar_retencion(self):
        selected = self.tabla_retenciones.focus()
        if selected:
            id_valor = self.ret_id.get().strip()
            codigo = self.ret_codigo.get().strip()
            tasa = self.ret_aliquota.get().strip()
            descripcion = self.ret_descripcion.get("1.0", tk.END).strip()

            if id_valor and codigo and tasa and descripcion:
                self.tabla_retenciones.item(selected, values=(id_valor, descripcion, tasa, codigo))
                self.cancelar_retencion()

    def eliminar_retencion(self):
        selected = self.tabla_retenciones.focus()
        if selected:
            self.tabla_retenciones.delete(selected)
            self.cancelar_retencion()

    def mostrar_config_ingresos(self):
        self.limpiar_subcontenido()

        # === Frame contenedor para el formulario ===
        formulario_frame = tk.Frame(self.sub_contenido, bg="#ecf0f1")
        formulario_frame.pack(anchor="w", padx=20, pady=10)

        formulario = tk.Frame(formulario_frame, bg="#ecf0f1")
        formulario.pack(anchor="w")

        # Fila 1: Id, Línea
        tk.Label(formulario, text="ID:", font=("Arial", 12), bg="#ecf0f1").grid(row=0, column=0, sticky="w", padx=5, pady=5)
        self.ent_ingreso_id = tk.Entry(formulario, width=20)
        self.ent_ingreso_id.grid(row=0, column=1, pady=5, sticky="w")

        tk.Label(formulario, text="Línea:", font=("Arial", 12), bg="#ecf0f1").grid(row=0, column=2, sticky="w", padx=5, pady=5)
        self.ent_ingreso_linea = tk.Entry(formulario, width=20)
        self.ent_ingreso_linea.grid(row=0, column=3, pady=5, sticky="w")

        # Fila 2: Descripción
        tk.Label(formulario, text="Descripción:", font=("Arial", 12), bg="#ecf0f1").grid(row=1, column=0, sticky="nw", padx=5, pady=5)
        self.ent_ingreso_desc = tk.Text(formulario, width=50, height=3)
        self.ent_ingreso_desc.grid(row=1, column=1, columnspan=3, pady=5, sticky="w")

        # Fila 3: Botones
        botones = tk.Frame(formulario, bg="#ecf0f1")
        botones.grid(row=2, column=0, columnspan=4, pady=10, sticky="w")

        tk.Button(botones, text="Agregar", width=12, command=self.agregar_ingreso).grid(row=0, column=0, padx=5)
        tk.Button(botones, text="Editar", width=12, command=self.editar_ingreso).grid(row=0, column=1, padx=5)
        tk.Button(botones, text="Eliminar", width=12, command=self.eliminar_ingreso).grid(row=0, column=2, padx=5)
        tk.Button(botones, text="Cancelar", width=12, command=self.cancelar_ingreso).grid(row=0, column=3, padx=5)

        # === Tabla para mostrar ingresos ===
        tabla_frame = tk.Frame(self.sub_contenido)
        tabla_frame.pack(fill="both", expand=True, padx=20, pady=10)

        self.tabla_ingresos = ttk.Treeview(tabla_frame, columns=("id", "linea", "descripcion"), show="headings")
        self.tabla_ingresos.heading("id", text="ID")
        self.tabla_ingresos.heading("linea", text="Línea")
        self.tabla_ingresos.heading("descripcion", text="Descripción")

        self.tabla_ingresos.column("id", width=50)
        self.tabla_ingresos.column("linea", width=150)
        self.tabla_ingresos.column("descripcion", width=600)

        self.tabla_ingresos.pack(fill="both", expand=True)

        self.tabla_ingresos.bind("<<TreeviewSelect>>", self.seleccionar_ingreso)

    def agregar_ingreso(self):
        id_val = self.ent_ingreso_id.get().strip()
        linea_val = self.ent_ingreso_linea.get().strip()
        desc_val = self.ent_ingreso_desc.get("1.0", "end").strip()

        if id_val and linea_val and desc_val:
            self.tabla_ingresos.insert("", "end", values=(id_val, linea_val, desc_val))
            self.cancelar_ingreso()

    def editar_ingreso(self):
        selected = self.tabla_ingresos.focus()
        if selected:
            id_val = self.ent_ingreso_id.get().strip()
            linea_val = self.ent_ingreso_linea.get().strip()
            desc_val = self.ent_ingreso_desc.get("1.0", "end").strip()

            if id_val and linea_val and desc_val:
                self.tabla_ingresos.item(selected, values=(id_val, linea_val, desc_val))
                self.cancelar_ingreso()

    def eliminar_ingreso(self):
        selected = self.tabla_ingresos.focus()
        if selected:
            self.tabla_ingresos.delete(selected)
            self.cancelar_ingreso()

    def cancelar_ingreso(self):
        self.ent_ingreso_id.delete(0, tk.END)
        self.ent_ingreso_linea.delete(0, tk.END)
        self.ent_ingreso_desc.delete("1.0", tk.END)

    def seleccionar_ingreso(self, event):
        selected = self.tabla_ingresos.focus()
        if selected:
            valores = self.tabla_ingresos.item(selected, "values")
            if valores:
                self.ent_ingreso_id.delete(0, tk.END)
                self.ent_ingreso_id.insert(0, valores[0])
                self.ent_ingreso_linea.delete(0, tk.END)
                self.ent_ingreso_linea.insert(0, valores[1])
                self.ent_ingreso_desc.delete("1.0", tk.END)
                self.ent_ingreso_desc.insert("1.0", valores[2])

    def mostrar_config_credito(self):
        self.limpiar_subcontenido()

        # === Frame contenedor para el formulario ===
        formulario_frame = tk.Frame(self.sub_contenido, bg="#ecf0f1")
        formulario_frame.pack(anchor="w", padx=20, pady=10)

        formulario = tk.Frame(formulario_frame, bg="#ecf0f1")
        formulario.pack(anchor="w")

        # Fila 1: Renglón, Descripción
        tk.Label(formulario, text="Renglón:", font=("Arial", 12), bg="#ecf0f1").grid(row=0, column=0, sticky="w", padx=5, pady=5)
        self.ent_credito_renglon = tk.Entry(formulario, width=20)
        self.ent_credito_renglon.grid(row=0, column=1, pady=5, sticky="w")

        tk.Label(formulario, text="Descripción:", font=("Arial", 12), bg="#ecf0f1").grid(row=0, column=2, sticky="w", padx=5, pady=5)
        self.ent_credito_desc = tk.Entry(formulario, width=50)
        self.ent_credito_desc.grid(row=0, column=3, pady=5, sticky="w")

        # Fila 2: Botones
        botones = tk.Frame(formulario, bg="#ecf0f1")
        botones.grid(row=1, column=0, columnspan=4, pady=10, sticky="w")

        tk.Button(botones, text="Agregar", width=12, command=self.agregar_credito).grid(row=0, column=0, padx=5)
        tk.Button(botones, text="Editar", width=12, command=self.editar_credito).grid(row=0, column=1, padx=5)
        tk.Button(botones, text="Eliminar", width=12, command=self.eliminar_credito).grid(row=0, column=2, padx=5)
        tk.Button(botones, text="Cancelar", width=12, command=self.cancelar_credito).grid(row=0, column=3, padx=5)

        # === Tabla para mostrar los créditos ===
        tabla_frame = tk.Frame(self.sub_contenido)
        tabla_frame.pack(fill="both", expand=True, padx=20, pady=10)

        self.tabla_credito = ttk.Treeview(tabla_frame, columns=("renglon", "descripcion"), show="headings")
        self.tabla_credito.heading("renglon", text="Renglón")
        self.tabla_credito.heading("descripcion", text="Descripción")

        self.tabla_credito.column("renglon", width=100)
        self.tabla_credito.column("descripcion", width=650)

        self.tabla_credito.pack(fill="both", expand=True)

        self.tabla_credito.bind("<<TreeviewSelect>>", self.seleccionar_credito)

    def agregar_credito(self):
        renglon = self.ent_credito_renglon.get().strip()
        desc = self.ent_credito_desc.get().strip()

        if renglon and desc:
            self.tabla_credito.insert("", "end", values=(renglon, desc))
            self.cancelar_credito()

    def editar_credito(self):
        selected = self.tabla_credito.focus()
        if selected:
            renglon = self.ent_credito_renglon.get().strip()
            desc = self.ent_credito_desc.get().strip()
            if renglon and desc:
                self.tabla_credito.item(selected, values=(renglon, desc))
                self.cancelar_credito()

    def eliminar_credito(self):
        selected = self.tabla_credito.focus()
        if selected:
            self.tabla_credito.delete(selected)
            self.cancelar_credito()

    def cancelar_credito(self):
        self.ent_credito_renglon.delete(0, tk.END)
        self.ent_credito_desc.delete(0, tk.END)

    def seleccionar_credito(self, event):
        selected = self.tabla_credito.focus()
        if selected:
            valores = self.tabla_credito.item(selected, "values")
            if valores:
                self.ent_credito_renglon.delete(0, tk.END)
                self.ent_credito_renglon.insert(0, valores[0])
                self.ent_credito_desc.delete(0, tk.END)
                self.ent_credito_desc.insert(0, valores[1])

    def mostrar_contribuyentes(self):
        self.limpiar_contenido()

        cont_frame = tk.Frame(self.area_contenido, bg="#ecf0f1")
        cont_frame.pack(fill="both", expand=True, padx=20, pady=10)

        # === Formulario superior ===
        formulario = tk.Frame(cont_frame, bg="#ecf0f1")
        formulario.pack(anchor="w", pady=5)

        # Fila 1: RUC, Razón Social
        tk.Label(formulario, text="RUC:", font=("Arial", 12), bg="#ecf0f1").grid(row=0, column=0, padx=5, pady=5, sticky="w")
        self.ent_ruc = tk.Entry(formulario, width=30)
        self.ent_ruc.grid(row=0, column=1, pady=5, sticky="w")

        tk.Label(formulario, text="Razón Social:", font=("Arial", 12), bg="#ecf0f1").grid(row=0, column=2, padx=5, pady=5, sticky="w")
        self.ent_razon = tk.Entry(formulario, width=40)
        self.ent_razon.grid(row=0, column=3, pady=5, sticky="w")

        # Fila 2: Checkbutton Aplicar Retención, Tipo de Impuesto
        self.retencion_var = tk.BooleanVar()
        tk.Checkbutton(formulario, text="Aplicar Retención a este Contribuyente", variable=self.retencion_var, bg="#ecf0f1").grid(row=1, column=0, columnspan=2, padx=5, pady=5, sticky="w")

        tk.Label(formulario, text="Tipo de Impuesto:", font=("Arial", 12), bg="#ecf0f1").grid(row=1, column=2, padx=5, pady=5, sticky="w")
        self.tipo_impuesto = ttk.Combobox(formulario, values=["IVA", "IR", "Municipal"], state="readonly", width=20)
        self.tipo_impuesto.grid(row=1, column=3, sticky="w")
        self.tipo_impuesto.set("IVA")

        # Fila 3: Botones
        fila_botones = tk.Frame(cont_frame, bg="#ecf0f1")
        fila_botones.pack(anchor="w", pady=5)

        tk.Button(fila_botones, text="Agregar", width=12, command=self.agregar_contribuyente).pack(side="left", padx=10)
        tk.Button(fila_botones, text="Cancelar", width=12, command=self.cancelar_contribuyente).pack(side="left")

        # === Tabla ===
        tabla_frame = tk.Frame(cont_frame)
        tabla_frame.pack(fill="both", expand=True, pady=10)

        self.tabla_contribuyentes = ttk.Treeview(tabla_frame, columns=("ruc", "razon"), show="headings")
        self.tabla_contribuyentes.heading("ruc", text="RUC")
        self.tabla_contribuyentes.heading("razon", text="Razón Social / Nombre")
        self.tabla_contribuyentes.column("ruc", width=150)
        self.tabla_contribuyentes.column("razon", width=600)
        self.tabla_contribuyentes.pack(fill="both", expand=True)

        self.tabla_contribuyentes.bind("<<TreeviewSelect>>", self.seleccionar_contribuyente)

        # === Fila inferior: botones y búsqueda ===
        inferior = tk.Frame(cont_frame, bg="#ecf0f1")
        inferior.pack(fill="x")

        tk.Button(inferior, text="Editar", width=12, command=self.editar_contribuyente).pack(side="left", padx=5, pady=5)
        tk.Button(inferior, text="Eliminar", width=12, command=self.eliminar_contribuyente).pack(side="left", padx=5, pady=5)

        tk.Label(inferior, text="Buscar:", bg="#ecf0f1", font=("Arial", 10)).pack(side="left", padx=(40, 5))
        self.entry_busqueda = tk.Entry(inferior, width=30)
        self.entry_busqueda.pack(side="left", padx=5)
        self.entry_busqueda.bind("<KeyRelease>", self.buscar_contribuyente)

    def agregar_contribuyente(self):
        ruc = self.ent_ruc.get().strip()
        razon = self.ent_razon.get().strip()
        if ruc and razon:
            self.tabla_contribuyentes.insert("", "end", values=(ruc, razon))
            self.cancelar_contribuyente()

    def cancelar_contribuyente(self):
        self.ent_ruc.delete(0, tk.END)
        self.ent_razon.delete(0, tk.END)
        self.tipo_impuesto.set("")
        self.retencion_var.set(False)

    def seleccionar_contribuyente(self, event=None):
        selected = self.tabla_contribuyentes.focus()
        if selected:
            valores = self.tabla_contribuyentes.item(selected, "values")
            if valores:
                self.ent_ruc.delete(0, tk.END)
                self.ent_ruc.insert(0, valores[0])
                self.ent_razon.delete(0, tk.END)
                self.ent_razon.insert(0, valores[1])

    def editar_contribuyente(self):
        selected = self.tabla_contribuyentes.focus()
        if selected:
            ruc = self.ent_ruc.get().strip()
            razon = self.ent_razon.get().strip()
            if ruc and razon:
                self.tabla_contribuyentes.item(selected, values=(ruc, razon))
                self.cancelar_contribuyente()

    def eliminar_contribuyente(self):
        selected = self.tabla_contribuyentes.focus()
        if selected:
            self.tabla_contribuyentes.delete(selected)
            self.cancelar_contribuyente()

    def buscar_contribuyente(self, event):
        query = self.entry_busqueda.get().strip().lower()
        for item in self.tabla_contribuyentes.get_children():
            valores = self.tabla_contribuyentes.item(item, "values")
            if query in valores[0].lower() or query in valores[1].lower():
                self.tabla_contribuyentes.reattach(item, '', 'end')
            else:
                self.tabla_contribuyentes.detach(item)

    def mostrar_retenciones(self):
        self.limpiar_contenido()

        # Contenedor del formulario de registro de impuestos
        tax_register_frame=tk.Frame(self.area_contenido, bg="#ecf0f1")
        tax_register_frame.pack(fill="both", expand=True, padx=20, pady=5)

        # Formulario para el registro de impuestos
        tax_register_form=tk.Frame(tax_register_frame, bg="#ecf0f1")
        tax_register_form.pack(anchor="w", pady=5)

        FontProperties=("Arial", "9")
        TaxList=["Rentas del trabajo", 
                 "Bienes y Servicios", 
                 "Bienes agropuecuarios", 
                 "Servicios profesionales",
                 "Rentas de capital inmobiliario",
                 "Rentas de capital mobiliario"]

        # Fila 0
            # RUC
        tk.Label(tax_register_form, text="Ruc").grid(row=0, column=0, padx=5, pady=5, sticky="e")
        ruc = tk.Entry(tax_register_form, font=FontProperties, width=23)
        ruc.grid(row=0, column=1)
            # Botón selector de RUC
        cmd_search_ruc = tk.Button(tax_register_form, text="::", width=2, font=FontProperties)
        cmd_search_ruc.grid(row=0, column=2)
            # Tipo de Impuesto
        tk.Label(tax_register_form, text="Tipo de Impuesto").grid(row=0, column=3, padx=5, pady=5, sticky="e")
        tax_type_list = ttk.Combobox(tax_register_form, font=FontProperties, values=TaxList, state="readonly", width=24)
        tax_type_list.grid(row=0, column=4, columnspan=3, sticky="w")
            # Fecha
        tk.Label(tax_register_form, text="Fecha").grid(row=0, column=7, padx=5, pady=5, sticky="e")
        idate = tk.Entry(tax_register_form, font=FontProperties, width=20)
        idate.grid(row=0, column=8)
            # Número de Documento
        tk.Label(tax_register_form, text="Documento").grid(row=0, column=9, padx=5, pady=5, sticky="e")
        doc_num = tk.Entry(tax_register_form, font=FontProperties, width=15)
        doc_num.grid(row=0, column=10, sticky="w")
        
        # Fila 1:
             # Razón Social
        tk.Label(tax_register_form, text="Razón Social").grid(row=1, column=0, padx=5, pady=5, sticky="e")
        razon_social = tk.Entry(tax_register_form, font=FontProperties, width=29)
        razon_social.grid(row=1, column=1, columnspan=2, sticky="w")
            # Tasa
        tk.Label(tax_register_form, text="Tasa").grid(row=1, column=3, padx=5, pady=5, sticky="e")
        tax_rate = tk.Entry(tax_register_form, width=7, font=FontProperties)
        tax_rate.grid(row=1, column=4)
            # Código de retención
        tk.Label(tax_register_form, text="Código").grid(row=1, column=5, padx=5, pady=5, sticky="e")
        entry_codigo = tk.Entry(tax_register_form, width=7, font=FontProperties)
        entry_codigo.grid(row=1, column=6)
            # Documento de Referencia (Ck o Número de Anticipo)
        tk.Label(tax_register_form, text="Referencia").grid(row=1, column=7, padx=5, pady=5, sticky="e")
        reference_num = tk.Entry(tax_register_form, font=FontProperties)
        reference_num.grid(row=1, column=8)
            # Valor bruto en la factura o documento
        tk.Label(tax_register_form, text="Valor").grid(row=1, column=9, padx=5, pady=5, sticky="e")
        entry_valor = tk.Entry(tax_register_form, width=15, font=FontProperties)
        entry_valor.grid(row=1, column=10, sticky="w")

        # Fila 2
        tk.Label(tax_register_form, text="Partidas Informativas:", 
                 font=("Arial", 9, "bold"), foreground="blue").grid(row=2, column=0, pady=5, columnspan=3, sticky="w")
        
        # Sección: Resumen de partidas
            # contenedor
        tax_register_resume_line=tk.Frame(tax_register_frame, bg="#ecf0f1")
        tax_register_resume_line.pack(anchor="nw", fill="x", padx=5)
            # Valor Bruto
        GrossValueEtq=tk.Label(tax_register_resume_line, 
                               text="Valor Bruto: C$", 
                               font=FontProperties, bg="#ecf0f1", foreground="blue")
        GrossValueEtq.pack(side="left", padx=5, pady=5)
        GrossValueTb=tk.Label(tax_register_resume_line, text="0.00", width=15, font=FontProperties)
        GrossValueTb.pack(side="left", padx=5, pady=5)
            # Valor Inss
        InssValueEtq=tk.Label(tax_register_resume_line, 
                              text="Valor Inss: C$", 
                              font=FontProperties,  bg="#ecf0f1", foreground="blue")
        InssValueEtq.pack(side="left", padx=5, pady=5)
        InssValueTb=tk.Label(tax_register_resume_line, text="0.00", width=15, font=FontProperties)
        InssValueTb.pack(side="left", padx=5, pady=5)
            # Valor Otro
        OtherValueEtq=tk.Label(tax_register_resume_line, 
                               text="Valor Otro: C$", 
                               font=FontProperties, bg="#ecf0f1", foreground="blue")
        OtherValueEtq.pack(side="left", padx=5, pady=5)
        OtherValueTb=tk.Label(tax_register_resume_line, text="0.00", width=15, font=FontProperties)
        OtherValueTb.pack(side="left", padx=5, pady=5)
            # Valor Retenido
        TaxAmountEtq=tk.Label(tax_register_resume_line, 
                              text="Valor Retenido: C$", 
                              font=FontProperties, bg="#ecf0f1", foreground="blue")
        TaxAmountEtq.pack(side="left", padx=5, pady=5)
        TaxAmountTb=tk.Label(tax_register_resume_line, text="0.00", width=15, font=FontProperties)
        TaxAmountTb.pack(side="left", padx=5, pady=5)
            # Ajustes al Valor Otro o Retenido
        cmd_adjust_tax = tk.Button(tax_register_resume_line, text="Ajustar", font=FontProperties)
        cmd_adjust_tax.pack(side="left", padx=5, pady=5)
    
        # ---------- TABLA ---------- #
        tax_register_preview_frame = tk.Frame(tax_register_frame, padx=10, pady=5, bg="#ecf0f1")
        tax_register_preview_frame.pack(anchor="nw", fill="y", padx=5)

        tax_register_preview_columns = ("Id", "Ruc", "Razón Social", "Fecha", "Num. Doc.", "Ref.", "Valor", "Tasa", "Retención")
        tax_register_preview = ttk.Treeview(tax_register_preview_frame, columns=tax_register_preview_columns, show="headings", height=15)
        
        for icol in tax_register_preview_columns:
            tax_register_preview.heading(icol, text=icol)
        
        tax_register_preview.column("Id", width=60)
        tax_register_preview.column("Ruc", width=120)
        tax_register_preview.column("Razón Social", width=300)
        tax_register_preview.column("Fecha", width=80)
        tax_register_preview.column("Num. Doc.", width=80)
        tax_register_preview.column("Ref.", width=80)
        tax_register_preview.column("Valor", width=120)
        tax_register_preview.column("Tasa", width=60)
        tax_register_preview.column("Retención", width=120)

        tax_register_preview.pack(anchor="nw", expand=True)

        # Frame para botones
        tax_register_buttons=tk.Frame(tax_register_frame, bg="#ecf0f1")
        tax_register_buttons.pack(anchor="nw", fill="x", padx=5, pady=5)

        # Botón Agregar
        Btn1=ttk.Button(tax_register_buttons, text="Agregar")
        Btn1.pack(side="left", padx=5, pady=5)
        # Botón Editar
        Btn2=ttk.Button(tax_register_buttons, text="Editar")
        Btn2.pack(side="left", padx=5, pady=5)
        # Botón Eliminar
        Btn3=ttk.Button(tax_register_buttons, text="Eliminar")
        Btn3.pack(side="left", padx=5, pady=5)
        # Botón Cancelar
        Btn4=ttk.Button(tax_register_buttons, text="Cancelar")
        Btn4.pack(side="left", padx=5, pady=5)
        # Etiqueta filtrar por
        Etq1=ttk.Label(tax_register_buttons, text="Filtrar por: ")
        Etq1.pack(side="left", padx=5, pady=5)
        # Combobox Filtrar por
        Cbo1=ttk.Combobox(tax_register_buttons, values=[
            "Ruc",
            "Razón Social",
            "Período",
            "Documento",
            "Referencia"], font=FontProperties, state="readonly")
        Cbo1.pack(side="left", padx=5, pady=5)

    def mostrar_ingresos(self):
        self.limpiar_contenido()
        tk.Label(self.area_contenido, text="Registro de Ingresos", font=("Arial", 16)).pack(pady=20)

    def mostrar_credito_iva(self):
        self.limpiar_contenido()
        tk.Label(self.area_contenido, text="Créditos IVA", font=("Arial", 16)).pack(pady=20)

    def mostrar_reportes(self):
        self.limpiar_contenido()
        tk.Label(self.area_contenido, text="Generación de Reportes", font=("Arial", 16)).pack(pady=20)
    
    def salir_aplicacion(self):
        self.destroy()

if __name__ == "__main__":
    app = App()
    app.mainloop()
