-- =========================
-- TRABAJADOR
-- =========================
CREATE TABLE Trabajador (
    trabajador_id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    usuario VARCHAR(50) UNIQUE,
    password VARCHAR(255),
    estado_usuario ENUM('ACTIVO', 'INACTIVO') DEFAULT 'ACTIVO'
);

-- =========================
-- JORNADA (El turno del trabajador)
-- =========================
CREATE TABLE Jornada (
    jornada_id INT AUTO_INCREMENT PRIMARY KEY,
    trabajador_id INT NOT NULL,
    fecha_hora_inicio DATETIME NOT NULL,
    fecha_hora_fin DATETIME NULL,
    FOREIGN KEY (trabajador_id) REFERENCES Trabajador(trabajador_id)
);

-- =========================
-- CAJA Y CAJA_JORNADA (Control de flujo por caja específica)
-- =========================
CREATE TABLE Caja (
    caja_id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) -- Ejemplo: "Caja Recepción", "Caja Bar/Productos"
);

CREATE TABLE CajaJornada (
    caja_jornada_id INT AUTO_INCREMENT PRIMARY KEY,
    caja_id INT,
    jornada_id INT,
    monto_apertura DECIMAL(10,2),
    monto_cierre DECIMAL(10,2),
    monto_sistema DECIMAL(10,2), -- Calculado: apertura + pagos_efectivo - egresos
    diferencia DECIMAL(10,2),
    FOREIGN KEY (caja_id) REFERENCES Caja(caja_id),
    FOREIGN KEY (jornada_id) REFERENCES Jornada(jornada_id)

);

-- =========================
-- CLIENTE Y HABITACION
-- =========================
CREATE TABLE Cliente (
    cliente_id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100),
    documento VARCHAR(50)
);

CREATE TABLE Habitacion (
    habitacion_id INT AUTO_INCREMENT PRIMARY KEY,
    numero VARCHAR(10),
    precio_hora_extra DECIMAL(10,2) DEFAULT 0,
    estado VARCHAR(50) -- 'DISPONIBLE', 'OCUPADA', 'LIMPIEZA', 'MANTENIMIENTO'
);

-- =========================
-- TARIFAS Y DURACION
-- =========================
CREATE TABLE Duracion (
    duracion_id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(50), -- '1 Hora', 'Hasta las 13:00', 'Semanal', 'Mes'
    categoria ENUM('TEMPORAL', 'PROLONGADO') NOT NULL,
    tipo_calculo ENUM('MINUTOS', 'DIAS', 'HORA_FIJA') NOT NULL, 
    valor INT NULL, -- Si es MINUTOS: 60. Si es DIAS: 7 (semana), 30 (mes).
    hora_fija_salida TIME NULL -- Para '13:00:00'
);

CREATE TABLE Tarifa (
    tarifa_id INT AUTO_INCREMENT PRIMARY KEY,
    habitacion_id INT,
    duracion_id INT,
    precio DECIMAL(10,2),
    UNIQUE (habitacion_id, duracion_id),
    FOREIGN KEY (habitacion_id) REFERENCES Habitacion(habitacion_id),
    FOREIGN KEY (duracion_id) REFERENCES Duracion(duracion_id)
);

-- =========================
-- ALQUILER (Contrato o Estancia)
-- =========================
CREATE TABLE Alquiler (
    alquiler_id INT AUTO_INCREMENT PRIMARY KEY,
    cliente_id INT,
    habitacion_id INT,  -- MANTENER: Por integridad histórica y reportes rápidos
    duracion_id INT,    -- MANTENER: Define la regla de tiempo aplicada
    tarifa_id INT,      -- AGREGAR: Referencia al origen del precio aplicado
    jornada_id INT,
    fecha_inicio DATETIME, 
    fecha_fin_estimada DATETIME, 
    fecha_salida_real DATETIME NULL, 
    precio_base DECIMAL(10,2),    -- "Snapshot" del precio de la tarifa en ese momento
    monto_extra DECIMAL(10,2) DEFAULT 0,
    precio_total DECIMAL(10,2),
    estado ENUM('ACTIVO', 'FINALIZADO', 'CANCELADO') DEFAULT 'ACTIVO',
    FOREIGN KEY (cliente_id) REFERENCES Cliente(cliente_id),
    FOREIGN KEY (habitacion_id) REFERENCES Habitacion(habitacion_id),
    FOREIGN KEY (duracion_id) REFERENCES Duracion(duracion_id),
    FOREIGN KEY (tarifa_id) REFERENCES Tarifa(tarifa_id),
    FOREIGN KEY (jornada_id) REFERENCES Jornada(jornada_id)
);

-- =========================
-- PRODUCTO Y VENTAS
-- =========================
CREATE TABLE Producto (
    producto_id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100),
    precio DECIMAL(10,2),
    stock_actual DECIMAL(10,2) DEFAULT 0
);

CREATE TABLE Venta (
    venta_id INT AUTO_INCREMENT PRIMARY KEY,
    jornada_id INT,
    fecha_hora DATETIME,
    total DECIMAL(10,2),
    FOREIGN KEY (jornada_id) REFERENCES Jornada(jornada_id)
);

CREATE TABLE DetalleVenta (
    detalle_id INT AUTO_INCREMENT PRIMARY KEY,
    venta_id INT,
    producto_id INT,
    cantidad DECIMAL(10,2),
    precio_unitario DECIMAL(10,2),
    subtotal DECIMAL(10,2),
    FOREIGN KEY (venta_id) REFERENCES Venta(venta_id),
    FOREIGN KEY (producto_id) REFERENCES Producto(producto_id)
);

-- =========================
-- TABLA DE PAGOS (LA CLAVE DEL REPORTE)
-- =========================
-- Esta tabla permite pagos mixtos y separar ingresos por método (Efectivo/QR)
CREATE TABLE Pago (
    pago_id INT AUTO_INCREMENT PRIMARY KEY,
    caja_jornada_id INT NOT NULL, 
    fecha_hora DATETIME DEFAULT CURRENT_TIMESTAMP,
    alquiler_id INT NULL,         
    venta_id INT NULL,            
    monto DECIMAL(10,2) NOT NULL,
    glosa VARCHAR(255),           -- Ejemplo: "Hab. 101 - Tarifa: 4 Horas"
    metodo_pago ENUM('EFECTIVO', 'QR') NOT NULL,
    FOREIGN KEY (caja_jornada_id) REFERENCES CajaJornada(caja_jornada_id),
    FOREIGN KEY (alquiler_id) REFERENCES Alquiler(alquiler_id),
    FOREIGN KEY (venta_id) REFERENCES Venta(venta_id)
);

-- =========================
-- PROMOCIONES
-- =========================
CREATE TABLE Promocion (
    promocion_id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100),
    tipo_promocion ENUM('DESCUENTO', 'PACK'),
    tipo_descuento ENUM('PORCENTAJE', 'MONTO'),
    valor DECIMAL(10,2),
    cantidad_compra INT,
    cantidad_paga INT,
    fecha_inicio DATE,
    fecha_fin DATE,
    estado VARCHAR(50)
);

CREATE TABLE AlquilerPromocion (
    id INT AUTO_INCREMENT PRIMARY KEY,
    alquiler_id INT,
    promocion_id INT,
    descuento_applied DECIMAL(10,2),
    FOREIGN KEY (alquiler_id) REFERENCES Alquiler(alquiler_id),
    FOREIGN KEY (promocion_id) REFERENCES Promocion(promocion_id)
);

-- =========================
-- INSUMOS Y MOVIMIENTOS
-- =========================
CREATE TABLE Insumo (
    insumo_id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100),
    unidad_medida VARCHAR(50),
    stock_actual DECIMAL(10,2) DEFAULT 0
);

CREATE TABLE MovimientoInsumo (
    movimiento_id INT AUTO_INCREMENT PRIMARY KEY,
    insumo_id INT,
    jornada_id INT,
    tipo_movimiento ENUM('INGRESO', 'CONSUMO'),
    cantidad DECIMAL(10,2),
    fecha_hora DATETIME,
    descripcion TEXT,
    habitacion_id INT NULL,
    FOREIGN KEY (insumo_id) REFERENCES Insumo(insumo_id),
    FOREIGN KEY (jornada_id) REFERENCES Jornada(jornada_id),
    FOREIGN KEY (habitacion_id) REFERENCES Habitacion(habitacion_id)
);

-- =========================
-- GESTION DE STOCK (INGRESOS)
-- =========================
CREATE TABLE IngresoProducto (
    ingreso_id INT AUTO_INCREMENT PRIMARY KEY,
    jornada_id INT NULL,
    fecha_hora DATETIME,
    observacion TEXT,
    FOREIGN KEY (jornada_id) REFERENCES Jornada(jornada_id)
);

CREATE TABLE DetalleIngresoProducto (
    detalle_id INT AUTO_INCREMENT PRIMARY KEY,
    ingreso_id INT,
    producto_id INT,
    cantidad DECIMAL(10,2),
    costo_unitario DECIMAL(10,2),
    FOREIGN KEY (ingreso_id) REFERENCES IngresoProducto(ingreso_id),
    FOREIGN KEY (producto_id) REFERENCES Producto(producto_id)
);

CREATE TABLE IngresoInsumo (
    ingreso_id INT AUTO_INCREMENT PRIMARY KEY,
    jornada_id INT NULL,
    fecha_hora DATETIME,
    observacion TEXT,
    FOREIGN KEY (jornada_id) REFERENCES Jornada(jornada_id)
);

CREATE TABLE DetalleIngresoInsumo (
    detalle_id INT AUTO_INCREMENT PRIMARY KEY,
    ingreso_id INT,
    insumo_id INT,
    cantidad DECIMAL(10,2),
    costo_unitario DECIMAL(10,2),
    FOREIGN KEY (ingreso_id) REFERENCES IngresoInsumo(ingreso_id),
    FOREIGN KEY (insumo_id) REFERENCES Insumo(insumo_id)
);

-- =========================
-- EGRESOS Y ACONTECIMIENTOS
-- =========================
CREATE TABLE EgresoCaja (
    egreso_id INT AUTO_INCREMENT PRIMARY KEY,
    caja_jornada_id INT,
    monto DECIMAL(10,2),
    fecha_hora DATETIME,
    descripcion TEXT,
    FOREIGN KEY (caja_jornada_id) REFERENCES CajaJornada(caja_jornada_id)
);

CREATE TABLE Acontecimiento (
    acontecimiento_id INT AUTO_INCREMENT PRIMARY KEY,
    jornada_id INT,
    fecha_hora DATETIME,
    tipo VARCHAR(50),--'MANTENIMIENTO', 'INCIDENCIA', 'OPERATIVO'
    descripcion TEXT,
    habitacion_id INT NULL,
    FOREIGN KEY (jornada_id) REFERENCES Jornada(jornada_id),
    FOREIGN KEY (habitacion_id) REFERENCES Habitacion(habitacion_id)
);

CREATE TABLE CargaInventario (
    carga_id INT AUTO_INCREMENT PRIMARY KEY,
    tipo ENUM('MERCADERIA', 'INSUMO') NOT NULL,
    fecha_hora DATETIME DEFAULT CURRENT_TIMESTAMP,
    trabajador_id INT NOT NULL
);

CREATE TABLE DetalleCarga (
    detalle_id INT AUTO_INCREMENT PRIMARY KEY,
    carga_id INT NOT NULL,
    item_id INT NOT NULL, -- ID del producto o insumo
    cantidad INT NOT NULL,
    FOREIGN KEY (carga_id) REFERENCES CargaInventario(carga_id)
);

CREATE TABLE GastoInsumo (
    gasto_id INT AUTO_INCREMENT PRIMARY KEY,
    insumo_id INT,
    trabajador_id INT,
    jornada_id INT,
    cantidad DECIMAL(10,2) NOT NULL,
    fecha_hora DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (insumo_id) REFERENCES Insumo(insumo_id),
    FOREIGN KEY (trabajador_id) REFERENCES Trabajador(trabajador_id),
    FOREIGN KEY (jornada_id) REFERENCES Jornada(jornada_id)
);