from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.spinner import Spinner
from kivy.uix.popup import Popup
from kivy.metrics import dp
from kivy.properties import ListProperty
import sqlite3
from datetime import datetime
import os

# Lista inicial de productos
PRODUCTOS_BASE = [
    ("Tacos", 40), ("Zope", 20), ("Chilaquiles grandes", 50),
    ("Chilaquiles chicos", 40), ("Sincronizada", 30), ("Café chico", 10),
    ("Café grande", 20), ("Pan", 10), ("Atole chico", 10),
    ("Atole grande", 20), ("Torta de pierna", 25), ("Torta de milanesa", 35),
    ("Torta de salchicha", 25), ("Torta de jamón", 25),
    ("Hot cake's", 15), ("Omelette", 50)
]

class Database:
    @staticmethod
    def init_databases():
        # Inventario
        conn = sqlite3.connect("inventario.db")
        c = conn.cursor()
        c.execute('''CREATE TABLE IF NOT EXISTS mercancia (
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        nombre TEXT UNIQUE,
                        cantidad_disponible REAL,
                        unidad TEXT
                    )''')
        conn.commit()
        conn.close()

        # Ventas
        conn = sqlite3.connect("ventas.db")
        c = conn.cursor()
        c.execute('''CREATE TABLE IF NOT EXISTS ventas (
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        producto TEXT,
                        cantidad_vendida INTEGER,
                        total INTEGER,
                        fecha TEXT
                    )''')
        conn.commit()
        conn.close()

        # Recetas
        conn = sqlite3.connect("recetas.db")
        c = conn.cursor()
        c.execute('''CREATE TABLE IF NOT EXISTS recetas (
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        producto TEXT,
                        ingrediente TEXT,
                        cantidad REAL
                    )''')
        conn.commit()
        conn.close()

        # Productos
        conn = sqlite3.connect("productos.db")
        c = conn.cursor()
        c.execute('''CREATE TABLE IF NOT EXISTS productos (
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        nombre TEXT UNIQUE,
                        precio INTEGER
                    )''')
        c.execute("SELECT COUNT(*) FROM productos")
        if c.fetchone()[0] == 0:
            c.executemany("INSERT INTO productos (nombre, precio) VALUES (?, ?)", PRODUCTOS_BASE)
        conn.commit()
        conn.close()

class InventarioScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        layout = BoxLayout(orientation='vertical', padding=dp(10), spacing=dp(10))
        
        # Título
        layout.add_widget(Label(text='INVENTARIO', size_hint_y=0.1, font_size='20sp', bold=True))
        
        # Formulario
        form = GridLayout(cols=2, size_hint_y=0.2, spacing=dp(5))
        form.add_widget(Label(text='Nombre:'))
        self.nombre_input = TextInput(multiline=False)
        form.add_widget(self.nombre_input)
        
        form.add_widget(Label(text='Cantidad:'))
        self.cantidad_input = TextInput(multiline=False, input_filter='float')
        form.add_widget(self.cantidad_input)
        
        form.add_widget(Label(text='Unidad:'))
        self.unidad_spinner = Spinner(text='Seleccionar', values=('g', 'kg', 'pz'))
        form.add_widget(self.unidad_spinner)
        
        layout.add_widget(form)
        
        # Botones
        btn_layout = BoxLayout(size_hint_y=0.1, spacing=dp(5))
        btn_agregar = Button(text='Agregar', background_color=(0.3, 0.7, 0.3, 1))
        btn_agregar.bind(on_press=self.agregar_mercancia)
        btn_layout.add_widget(btn_agregar)
        
        btn_actualizar = Button(text='Actualizar', background_color=(0.3, 0.3, 0.7, 1))
        btn_actualizar.bind(on_press=lambda x: self.cargar_inventario())
        btn_layout.add_widget(btn_actualizar)
        
        layout.add_widget(btn_layout)
        
        # Lista de inventario
        scroll = ScrollView(size_hint_y=0.6)
        self.inventario_layout = GridLayout(cols=1, spacing=dp(2), size_hint_y=None)
        self.inventario_layout.bind(minimum_height=self.inventario_layout.setter('height'))
        scroll.add_widget(self.inventario_layout)
        layout.add_widget(scroll)
        
        self.add_widget(layout)
        self.cargar_inventario()
    
    def agregar_mercancia(self, instance):
        nombre = self.nombre_input.text.strip()
        unidad = self.unidad_spinner.text
        try:
            cantidad = float(self.cantidad_input.text)
        except:
            self.show_popup("Error", "La cantidad debe ser un número")
            return
        
        if not nombre or unidad == 'Seleccionar':
            self.show_popup("Error", "Completa todos los campos")
            return
        
        # Convertir a unidad base
        if unidad == "kg":
            cantidad *= 1000
            unidad_base = "g"
        elif unidad == "g":
            unidad_base = "g"
        else:
            unidad_base = "pz"
        
        conn = sqlite3.connect("inventario.db")
        c = conn.cursor()
        c.execute("SELECT cantidad_disponible, unidad FROM mercancia WHERE nombre = ?", (nombre,))
        producto = c.fetchone()
        
        if producto:
            if producto[1] != unidad_base:
                self.show_popup("Error", f"'{nombre}' ya existe como {producto[1]}")
                conn.close()
                return
            nueva_cantidad = producto[0] + cantidad
            c.execute("UPDATE mercancia SET cantidad_disponible = ? WHERE nombre = ?", (nueva_cantidad, nombre))
        else:
            c.execute("INSERT INTO mercancia (nombre, cantidad_disponible, unidad) VALUES (?, ?, ?)", 
                     (nombre, cantidad, unidad_base))
        
        conn.commit()
        conn.close()
        
        self.nombre_input.text = ""
        self.cantidad_input.text = ""
        self.unidad_spinner.text = "Seleccionar"
        self.cargar_inventario()
        self.show_popup("Éxito", f"'{nombre}' agregado al inventario")
    
    def cargar_inventario(self):
        self.inventario_layout.clear_widgets()
        conn = sqlite3.connect("inventario.db")
        c = conn.cursor()
        c.execute("SELECT nombre, cantidad_disponible, unidad FROM mercancia ORDER BY nombre")
        
        for nombre, cantidad, unidad in c.fetchall():
            if unidad == "g" and cantidad >= 1000:
                texto = f"{nombre}: {cantidad/1000:.2f} kg"
            elif unidad == "g":
                texto = f"{nombre}: {cantidad:.0f} g"
            else:
                texto = f"{nombre}: {cantidad:.0f} pz"
            
            item_layout = BoxLayout(size_hint_y=None, height=dp(40))
            item_layout.add_widget(Label(text=texto, size_hint_x=0.7))
            btn_eliminar = Button(text='Eliminar', size_hint_x=0.3, 
                                background_color=(0.8, 0.2, 0.2, 1))
            btn_eliminar.bind(on_press=lambda x, n=nombre: self.eliminar_mercancia(n))
            item_layout.add_widget(btn_eliminar)
            self.inventario_layout.add_widget(item_layout)
        
        conn.close()
    
    def eliminar_mercancia(self, nombre):
        conn = sqlite3.connect("inventario.db")
        c = conn.cursor()
        c.execute("DELETE FROM mercancia WHERE nombre = ?", (nombre,))
        conn.commit()
        conn.close()
        self.cargar_inventario()
        self.show_popup("Eliminado", f"'{nombre}' eliminado del inventario")
    
    def show_popup(self, title, message):
        popup = Popup(title=title, content=Label(text=message),
                     size_hint=(0.8, 0.3))
        popup.open()

class VentasScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        layout = BoxLayout(orientation='vertical', padding=dp(10), spacing=dp(10))
        
        layout.add_widget(Label(text='VENTAS REGISTRADAS', size_hint_y=0.1, 
                               font_size='20sp', bold=True))
        
        btn_actualizar = Button(text='Actualizar', size_hint_y=0.08,
                              background_color=(0.3, 0.3, 0.7, 1))
        btn_actualizar.bind(on_press=lambda x: self.cargar_ventas())
        layout.add_widget(btn_actualizar)
        
        scroll = ScrollView()
        self.ventas_layout = GridLayout(cols=1, spacing=dp(2), size_hint_y=None)
        self.ventas_layout.bind(minimum_height=self.ventas_layout.setter('height'))
        scroll.add_widget(self.ventas_layout)
        layout.add_widget(scroll)
        
        self.add_widget(layout)
        self.cargar_ventas()
    
    def on_enter(self):
        # Se ejecuta automáticamente al entrar a esta pantalla
        self.cargar_ventas()
    
    def cargar_ventas(self):
        self.ventas_layout.clear_widgets()
        conn = sqlite3.connect("ventas.db")
        c = conn.cursor()
        c.execute("SELECT producto, cantidad_vendida, total, fecha FROM ventas ORDER BY id DESC")
        
        for producto, cantidad, total, fecha in c.fetchall():
            texto = f"{producto} x{cantidad} - ${total}\n{fecha}"
            label = Label(text=texto, size_hint_y=None, height=dp(60), 
                         halign='left', valign='middle')
            label.bind(size=label.setter('text_size'))
            self.ventas_layout.add_widget(label)
        
        conn.close()

class VentasRapidasScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.layout = BoxLayout(orientation='vertical', padding=dp(10), spacing=dp(10))
        
        self.layout.add_widget(Label(text='VENTAS RÁPIDAS', size_hint_y=0.08, 
                                    font_size='20sp', bold=True))
        
        btn_actualizar = Button(text='Actualizar productos', size_hint_y=0.08,
                              background_color=(0.3, 0.3, 0.7, 1))
        btn_actualizar.bind(on_press=lambda x: self.crear_botones())
        self.layout.add_widget(btn_actualizar)
        
        scroll = ScrollView()
        self.grid = GridLayout(cols=2, spacing=dp(10), size_hint_y=None, padding=dp(10))
        self.grid.bind(minimum_height=self.grid.setter('height'))
        scroll.add_widget(self.grid)
        self.layout.add_widget(scroll)
        
        # Botones de gestión
        btn_layout = GridLayout(cols=3, size_hint_y=0.15, spacing=dp(5))
        
        btn_agregar = Button(text='Agregar\nProducto', background_color=(0.3, 0.7, 0.3, 1))
        btn_agregar.bind(on_press=self.agregar_producto)
        btn_layout.add_widget(btn_agregar)
        
        btn_eliminar = Button(text='Eliminar\nProducto', background_color=(0.8, 0.2, 0.2, 1))
        btn_eliminar.bind(on_press=self.eliminar_producto)
        btn_layout.add_widget(btn_eliminar)
        
        btn_receta = Button(text='Configurar\nRecetas', background_color=(0.8, 0.6, 0.2, 1))
        btn_receta.bind(on_press=self.configurar_receta)
        btn_layout.add_widget(btn_receta)
        
        self.layout.add_widget(btn_layout)
        
        self.add_widget(self.layout)
        self.crear_botones()
    
    def crear_botones(self):
        self.grid.clear_widgets()
        conn = sqlite3.connect("productos.db")
        c = conn.cursor()
        c.execute("SELECT nombre, precio FROM productos ORDER BY nombre")
        
        for nombre, precio in c.fetchall():
            btn = Button(text=f"{nombre}\n${precio}", size_hint_y=None, height=dp(80),
                        background_color=(0.2, 0.6, 0.8, 1))
            btn.bind(on_press=lambda x, n=nombre: self.registrar_venta(n))
            self.grid.add_widget(btn)
        
        conn.close()
    
    def registrar_venta(self, nombre):
        conn_prod = sqlite3.connect("productos.db")
        c = conn_prod.cursor()
        c.execute("SELECT precio FROM productos WHERE nombre = ?", (nombre,))
        data = c.fetchone()
        if not data:
            self.show_popup("Error", f"Producto '{nombre}' no existe")
            return
        precio = data[0]
        conn_prod.close()
        
        # Verificar ingredientes y descontar
        conn_inv = sqlite3.connect("inventario.db")
        c_inv = conn_inv.cursor()
        conn_rec = sqlite3.connect("recetas.db")
        c_rec = conn_rec.cursor()
        c_rec.execute("SELECT ingrediente, cantidad FROM recetas WHERE producto = ?", (nombre,))
        ingredientes = c_rec.fetchall()
        
        for ing, cant in ingredientes:
            c_inv.execute("SELECT cantidad_disponible FROM mercancia WHERE nombre = ?", (ing,))
            disponible = c_inv.fetchone()
            if not disponible or disponible[0] < cant:
                self.show_popup("Error", f"No hay suficiente '{ing}'")
                conn_rec.close()
                conn_inv.close()
                return
            c_inv.execute("UPDATE mercancia SET cantidad_disponible = cantidad_disponible - ? WHERE nombre = ?", 
                         (cant, ing))
        
        conn_inv.commit()
        conn_inv.close()
        conn_rec.close()
        
        # Registrar venta
        conn_ven = sqlite3.connect("ventas.db")
        c = conn_ven.cursor()
        fecha = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        c.execute("INSERT INTO ventas (producto, cantidad_vendida, total, fecha) VALUES (?, ?, ?, ?)",
                 (nombre, 1, precio, fecha))
        conn_ven.commit()
        conn_ven.close()
        
        self.show_popup("Venta registrada", f"{nombre} - ${precio}")
    
    def agregar_producto(self, instance):
        content = BoxLayout(orientation='vertical', spacing=dp(10), padding=dp(10))
        content.add_widget(Label(text='Nombre del producto:', size_hint_y=0.15))
        nombre_input = TextInput(multiline=False, size_hint_y=0.15)
        content.add_widget(nombre_input)
        
        content.add_widget(Label(text='Precio:', size_hint_y=0.15))
        precio_input = TextInput(multiline=False, input_filter='int', size_hint_y=0.15)
        content.add_widget(precio_input)
        
        btn_layout = BoxLayout(spacing=dp(5), size_hint_y=0.2)
        
        popup = Popup(title='Nuevo Producto', content=content, size_hint=(0.9, 0.6))
        
        def guardar(x):
            nombre = nombre_input.text.strip()
            try:
                precio = int(precio_input.text)
            except:
                return
            
            if nombre:
                conn = sqlite3.connect("productos.db")
                c = conn.cursor()
                try:
                    c.execute("INSERT INTO productos (nombre, precio) VALUES (?, ?)", (nombre, precio))
                    conn.commit()
                    popup.dismiss()
                    self.crear_botones()
                except:
                    pass
                conn.close()
        
        btn_guardar = Button(text='Guardar', background_color=(0.3, 0.7, 0.3, 1),
                           size_hint_y=None, height=dp(50))
        btn_guardar.bind(on_press=guardar)
        btn_layout.add_widget(btn_guardar)
        
        btn_cancelar = Button(text='Cancelar', background_color=(0.7, 0.3, 0.3, 1),
                            size_hint_y=None, height=dp(50))
        btn_cancelar.bind(on_press=popup.dismiss)
        btn_layout.add_widget(btn_cancelar)
        
        content.add_widget(btn_layout)
        popup.open()
    
    def eliminar_producto(self, instance):
        content = BoxLayout(orientation='vertical', spacing=dp(10), padding=dp(10))
        
        content.add_widget(Label(text='Selecciona el producto a eliminar:', 
                                size_hint_y=0.2, font_size='16sp'))
        
        # Obtener lista de productos
        conn = sqlite3.connect("productos.db")
        c = conn.cursor()
        c.execute("SELECT nombre FROM productos ORDER BY nombre")
        productos = [p[0] for p in c.fetchall()]
        conn.close()
        
        if not productos:
            self.show_popup("Error", "No hay productos para eliminar")
            return
        
        producto_spinner = Spinner(
            text='Seleccionar producto',
            values=productos,
            size_hint_y=0.2
        )
        content.add_widget(producto_spinner)
        
        btn_layout = BoxLayout(spacing=dp(5), size_hint_y=0.25)
        
        popup = Popup(title='Eliminar Producto', content=content, size_hint=(0.9, 0.5))
        
        def confirmar_eliminar(x):
            nombre = producto_spinner.text
            if nombre == 'Seleccionar producto':
                self.show_popup("Error", "Selecciona un producto")
                return
            
            conn = sqlite3.connect("productos.db")
            c = conn.cursor()
            c.execute("DELETE FROM productos WHERE nombre = ?", (nombre,))
            conn.commit()
            conn.close()
            
            # También eliminar su receta si existe
            conn_rec = sqlite3.connect("recetas.db")
            c_rec = conn_rec.cursor()
            c_rec.execute("DELETE FROM recetas WHERE producto = ?", (nombre,))
            conn_rec.commit()
            conn_rec.close()
            
            popup.dismiss()
            self.crear_botones()
            self.show_popup("Eliminado", f"Producto '{nombre}' eliminado")
        
        btn_eliminar = Button(text='Eliminar', background_color=(0.8, 0.2, 0.2, 1),
                            size_hint_y=None, height=dp(50))
        btn_eliminar.bind(on_press=confirmar_eliminar)
        btn_layout.add_widget(btn_eliminar)
        
        btn_cancelar = Button(text='Cancelar', background_color=(0.5, 0.5, 0.5, 1),
                            size_hint_y=None, height=dp(50))
        btn_cancelar.bind(on_press=popup.dismiss)
        btn_layout.add_widget(btn_cancelar)
        
        content.add_widget(btn_layout)
        popup.open()
    
    def configurar_receta(self, instance):
        self.show_popup("Recetas", "Función de recetas disponible.\nImplementa interfaz según necesites.")
    
    def show_popup(self, title, message):
        popup = Popup(title=title, content=Label(text=message),
                     size_hint=(0.8, 0.3))
        popup.open()

class VentasApp(App):
    def build(self):
        Database.init_databases()
        sm = ScreenManager()
        sm.add_widget(InventarioScreen(name='inventario'))
        sm.add_widget(VentasScreen(name='ventas'))
        sm.add_widget(VentasRapidasScreen(name='rapidas'))
        
        # Layout principal con navegación
        main_layout = BoxLayout(orientation='vertical')
        
        # Navegación
        nav = BoxLayout(size_hint_y=0.1, spacing=dp(2))
        btn_inv = Button(text='Inventario', background_color=(0.2, 0.5, 0.7, 1))
        btn_inv.bind(on_press=lambda x: setattr(sm, 'current', 'inventario'))
        nav.add_widget(btn_inv)
        
        btn_ven = Button(text='Ventas', background_color=(0.2, 0.5, 0.7, 1))
        btn_ven.bind(on_press=lambda x: setattr(sm, 'current', 'ventas'))
        nav.add_widget(btn_ven)
        
        btn_rap = Button(text='Venta Rápida', background_color=(0.2, 0.5, 0.7, 1))
        btn_rap.bind(on_press=lambda x: setattr(sm, 'current', 'rapidas'))
        nav.add_widget(btn_rap)
        
        btn_salir = Button(text='Salir', background_color=(0.8, 0.2, 0.2, 1))
        btn_salir.bind(on_press=self.confirmar_salir)
        nav.add_widget(btn_salir)
        
        main_layout.add_widget(nav)
        main_layout.add_widget(sm)
        
        return main_layout
    
    def confirmar_salir(self, instance):
        content = BoxLayout(orientation='vertical', spacing=dp(20), padding=dp(20))
        content.add_widget(Label(text='¿Estás seguro que deseas salir?', 
                                font_size='18sp', size_hint_y=0.4))
        
        btn_layout = BoxLayout(spacing=dp(10), size_hint_y=0.3)
        
        popup = Popup(title='Confirmar salida', content=content, 
                     size_hint=(0.8, 0.4), auto_dismiss=False)
        
        btn_si = Button(text='Sí, salir', background_color=(0.8, 0.2, 0.2, 1),
                       size_hint_y=None, height=dp(50))
        btn_si.bind(on_press=lambda x: self.stop())
        btn_layout.add_widget(btn_si)
        
        btn_no = Button(text='Cancelar', background_color=(0.3, 0.7, 0.3, 1),
                       size_hint_y=None, height=dp(50))
        btn_no.bind(on_press=popup.dismiss)
        btn_layout.add_widget(btn_no)
        
        content.add_widget(btn_layout)
        popup.open()

if __name__ == '__main__':
    VentasApp().run()