-- Script de inicialización para pycore 
-- Verificar si la base de datos ya existe y solo crear tablas si no existen

-- Crear tipos ENUM personalizados si no existen
DO $$ BEGIN
    CREATE TYPE tipo_producto_enum AS ENUM ('insumo', 'terminado');
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- 1️⃣ Sucursales
CREATE TABLE IF NOT EXISTS Sucursales (
    id_sucursal SERIAL PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    direccion VARCHAR(255),
    telefono VARCHAR(20),
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 2️⃣ Inventario
CREATE TABLE IF NOT EXISTS Inventario (
    id_producto SERIAL PRIMARY KEY,
    nombre_producto VARCHAR(100) NOT NULL,
    tipo_producto tipo_producto_enum NOT NULL,
    precio_unitario DECIMAL(10,2) NOT NULL,
    stock INT DEFAULT 0,
    id_sucursal INT,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_sucursal) REFERENCES Sucursales(id_sucursal)
);

-- 3️⃣ Compras
CREATE TABLE IF NOT EXISTS Compras (
    id_compra SERIAL PRIMARY KEY,
    id_sucursal INT NOT NULL,
    fecha_compra DATE NOT NULL,
    total DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (id_sucursal) REFERENCES Sucursales(id_sucursal)
);

-- 4️⃣ Detalle_compras
CREATE TABLE IF NOT EXISTS Detalle_compras (
    id_detalle SERIAL PRIMARY KEY,
    id_compra INT NOT NULL,
    id_producto INT NOT NULL,
    cantidad INT NOT NULL,
    precio_unitario DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (id_compra) REFERENCES Compras(id_compra),
    FOREIGN KEY (id_producto) REFERENCES Inventario(id_producto)
);

-- 5️⃣ Promociones
CREATE TABLE IF NOT EXISTS Promociones (
    id_promocion SERIAL PRIMARY KEY,
    nombre_promocion VARCHAR(100) NOT NULL,
    descripcion TEXT,
    descuento DECIMAL(5,2), -- Porcentaje
    fecha_inicio DATE,
    fecha_fin DATE
);

-- 6️⃣ Colaboradores
CREATE TABLE IF NOT EXISTS Colaboradores (
    id_colaborador SERIAL PRIMARY KEY,
    id_sucursal INT NOT NULL,
    nombre VARCHAR(100) NOT NULL,
    puesto VARCHAR(50),
    salario DECIMAL(10,2),
    fecha_ingreso DATE,
    FOREIGN KEY (id_sucursal) REFERENCES Sucursales(id_sucursal)
);

-- 7️⃣ Gastos_sucursal
CREATE TABLE IF NOT EXISTS Gastos_sucursal (
    id_gasto SERIAL PRIMARY KEY,
    id_sucursal INT NOT NULL,
    concepto VARCHAR(255) NOT NULL,
    monto DECIMAL(10,2) NOT NULL,
    fecha_gasto DATE NOT NULL,
    FOREIGN KEY (id_sucursal) REFERENCES Sucursales(id_sucursal)
);

-- 8️⃣ Ventas
CREATE TABLE IF NOT EXISTS Ventas (
    id_venta SERIAL PRIMARY KEY,
    id_sucursal INT NOT NULL,
    fecha_venta TIMESTAMP NOT NULL,
    total DECIMAL(10,2) NOT NULL,
    id_promocion INT,
    FOREIGN KEY (id_sucursal) REFERENCES Sucursales(id_sucursal),
    FOREIGN KEY (id_promocion) REFERENCES Promociones(id_promocion)
);

-- 9️⃣ Detalle_ventas
CREATE TABLE IF NOT EXISTS Detalle_ventas (
    id_detalle SERIAL PRIMARY KEY,
    id_venta INT NOT NULL,
    id_producto INT NOT NULL,
    cantidad INT NOT NULL,
    precio_unitario DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (id_venta) REFERENCES Ventas(id_venta),
    FOREIGN KEY (id_producto) REFERENCES Inventario(id_producto)
);

-- ==========================
-- ÍNDICES PARA MEJOR PERFORMANCE
-- ==========================

DO $$ BEGIN
    CREATE INDEX IF NOT EXISTS idx_inventario_sucursal ON Inventario(id_sucursal);
    CREATE INDEX IF NOT EXISTS idx_ventas_fecha ON Ventas(fecha_venta);
    CREATE INDEX IF NOT EXISTS idx_ventas_sucursal ON Ventas(id_sucursal);
    CREATE INDEX IF NOT EXISTS idx_compras_fecha ON Compras(fecha_compra);
    CREATE INDEX IF NOT EXISTS idx_detalle_ventas_producto ON Detalle_ventas(id_producto);
    CREATE INDEX IF NOT EXISTS idx_detalle_compras_producto ON Detalle_compras(id_producto);
    CREATE INDEX IF NOT EXISTS idx_colaboradores_sucursal ON Colaboradores(id_sucursal);
EXCEPTION
    WHEN duplicate_table THEN null;
END $$;

-- ==========================
-- DATOS DE EJEMPLO
-- ==========================

-- Insertar sucursal principal si no existen
INSERT INTO Sucursales (id_sucursal, nombre, direccion, telefono) VALUES 
(1, 'Alitas Downtown', 'Av. Principal 123, Ciudad', '+52-55-1234-5678'),
(2, 'Alitas Norte', 'Plaza Norte 456, Zona Norte', '+52-55-8765-4321')
ON CONFLICT (id_sucursal) DO UPDATE SET 
nombre = EXCLUDED.nombre,
direccion = EXCLUDED.direccion,
telefono = EXCLUDED.telefono;

-- Insertar productos típicos de alitas
INSERT INTO Inventario (id_producto, nombre_producto, tipo_producto, precio_unitario, stock, id_sucursal) VALUES 
(1, 'Alitas de pollo', 'insumo', 45.50, 200, 1),
(2, 'Salsa BBQ', 'insumo', 25.00, 50, 1),
(3, 'Salsa Buffalo', 'insumo', 28.00, 40, 1),
(4, 'Papas para freír', 'insumo', 18.00, 100, 1),
(5, 'Harina para empanizar', 'insumo', 12.50, 30, 1),
(6, 'Orden de alitas (6 pzas)', 'terminado', 120.00, 0, 1),
(7, 'Orden de alitas (12 pzas)', 'terminado', 220.00, 0, 1),
(8, 'Papas a la francesa', 'terminado', 45.00, 0, 1),
(9, 'Aros de cebolla', 'terminado', 55.00, 0, 1)
ON CONFLICT (id_producto) DO UPDATE SET 
nombre_producto = EXCLUDED.nombre_producto,
tipo_producto = EXCLUDED.tipo_producto,
precio_unitario = EXCLUDED.precio_unitario,
stock = EXCLUDED.stock,
id_sucursal = EXCLUDED.id_sucursal;

-- Insertar promociones
INSERT INTO Promociones (id_promocion, nombre_promocion, descripcion, descuento, fecha_inicio, fecha_fin) VALUES 
(1, 'Martes de Alitas', '2x1 en órdenes de alitas todos los martes', 50.00, '2024-01-01', '2024-12-31'),
(2, 'Happy Hour', '20% de descuento en bebidas de 4pm a 7pm', 20.00, '2024-01-01', '2024-12-31'),
(3, 'Combo Familiar', 'Descuento especial en combos familiares', 15.00, '2024-03-01', '2024-03-31')
ON CONFLICT (id_promocion) DO UPDATE SET 
nombre_promocion = EXCLUDED.nombre_promocion,
descripcion = EXCLUDED.descripcion,
descuento = EXCLUDED.descuento,
fecha_inicio = EXCLUDED.fecha_inicio,
fecha_fin = EXCLUDED.fecha_fin;

-- Insertar colaboradores
INSERT INTO Colaboradores (id_colaborador, id_sucursal, nombre, puesto, salario, fecha_ingreso) VALUES 
(1, 1, 'Juan Pérez García', 'Gerente', 15000.00, '2023-01-15'),
(2, 1, 'María Hernández López', 'Cocinero', 8000.00, '2023-03-20'),
(3, 1, 'Carlos Rodríguez Silva', 'Mesero', 6000.00, '2023-05-10')
ON CONFLICT (id_colaborador) DO UPDATE SET 
id_sucursal = EXCLUDED.id_sucursal,
nombre = EXCLUDED.nombre,
puesto = EXCLUDED.puesto,
salario = EXCLUDED.salario,
fecha_ingreso = EXCLUDED.fecha_ingreso;
