-- =============================================================
--  PARQUEADERO SMART — Schema completo v1.0
--  Base de datos única, limpia, con todo incluido.
--  Ejecutar una sola vez en una base de datos vacía.
-- =============================================================

CREATE DATABASE IF NOT EXISTS parqueadero_db
  CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE parqueadero_db;

-- -------------------------------------------------------------
-- USUARIOS
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS usuarios (
    id_usuario    INT AUTO_INCREMENT PRIMARY KEY,
    usuario       VARCHAR(50)  UNIQUE NOT NULL,
    password      VARCHAR(255) NOT NULL,
    nombre        VARCHAR(100) NOT NULL,
    rol           ENUM('admin','trabajador') DEFAULT 'trabajador',
    activo        BOOLEAN DEFAULT TRUE,
    fecha_registro DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- -------------------------------------------------------------
-- CATEGORÍAS DE VEHÍCULOS (con tarifa incluida)
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS categorias (
    id_categoria   INT AUTO_INCREMENT PRIMARY KEY,
    nombre         VARCHAR(50) UNIQUE NOT NULL,
    descripcion    TEXT,
    costo_por_hora DECIMAL(10,2) NOT NULL DEFAULT 0,
    fraccion_minima INT NOT NULL DEFAULT 15,
    icono          VARCHAR(30) DEFAULT '🚗',
    activo         BOOLEAN DEFAULT TRUE,
    created_at     DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at     DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- -------------------------------------------------------------
-- TARIFAS (una por categoría)
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS tarifas (
    id_tarifa       INT AUTO_INCREMENT PRIMARY KEY,
    tipo_vehiculo   ENUM('carro','moto','camioneta') NOT NULL,
    id_categoria    INT NOT NULL UNIQUE,
    costo_por_hora  DECIMAL(10,2) NOT NULL,
    fraccion_minima INT DEFAULT 15,
    FOREIGN KEY (id_categoria) REFERENCES categorias(id_categoria)
);

-- -------------------------------------------------------------
-- CLIENTES
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS clientes (
    id_cliente INT AUTO_INCREMENT PRIMARY KEY,
    nombre     VARCHAR(100) NOT NULL,
    telefono   VARCHAR(20)  DEFAULT NULL,
    email      VARCHAR(100) DEFAULT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- -------------------------------------------------------------
-- VEHÍCULOS
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS vehiculos (
    id_vehiculo  INT AUTO_INCREMENT PRIMARY KEY,
    placa        VARCHAR(10) UNIQUE NOT NULL,
    tipo         ENUM('carro','moto','camioneta') NOT NULL,
    id_categoria INT NOT NULL,
    id_cliente   INT DEFAULT NULL,
    marca        VARCHAR(50),
    modelo       VARCHAR(50),
    color        VARCHAR(30),
    FOREIGN KEY (id_categoria) REFERENCES categorias(id_categoria),
    FOREIGN KEY (id_cliente)   REFERENCES clientes(id_cliente) ON DELETE SET NULL
);

-- -------------------------------------------------------------
-- ESPACIOS DE ESTACIONAMIENTO
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS espacios (
    id_espacio VARCHAR(10) PRIMARY KEY,
    tipo       ENUM('carro','moto') NOT NULL DEFAULT 'carro',
    fila       VARCHAR(5)  NOT NULL,
    numero     INT         NOT NULL,
    etiqueta   VARCHAR(50) DEFAULT NULL,
    pos_x      INT         DEFAULT NULL,
    pos_y      INT         DEFAULT NULL,
    activo     BOOLEAN DEFAULT TRUE
);

-- -------------------------------------------------------------
-- CAJAS
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS cajas (
    id_caja             INT AUTO_INCREMENT PRIMARY KEY,
    id_usuario_apertura INT NOT NULL,
    id_usuario_cierre   INT DEFAULT NULL,
    monto_inicial       DECIMAL(10,2) NOT NULL DEFAULT 0,
    monto_final         DECIMAL(10,2) DEFAULT NULL,
    fecha_apertura      DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    fecha_cierre        DATETIME DEFAULT NULL,
    estado              ENUM('ABIERTA','CERRADA') NOT NULL DEFAULT 'ABIERTA',
    observaciones       TEXT,
    FOREIGN KEY (id_usuario_apertura) REFERENCES usuarios(id_usuario),
    FOREIGN KEY (id_usuario_cierre)   REFERENCES usuarios(id_usuario)
);

-- -------------------------------------------------------------
-- REGISTROS DE ESTACIONAMIENTO
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS registros_estacionamiento (
    id_registro        INT AUTO_INCREMENT PRIMARY KEY,
    id_vehiculo        INT NOT NULL,
    espacio_id         VARCHAR(10) NOT NULL,
    id_cliente         INT DEFAULT NULL,
    fecha_hora_entrada DATETIME NOT NULL,
    fecha_hora_salida  DATETIME DEFAULT NULL,
    id_tarifa_aplicada INT NOT NULL,
    estado             ENUM('ACTIVO','FINALIZADO') DEFAULT 'ACTIVO',
    FOREIGN KEY (id_vehiculo)        REFERENCES vehiculos(id_vehiculo),
    FOREIGN KEY (id_cliente)         REFERENCES clientes(id_cliente) ON DELETE SET NULL,
    FOREIGN KEY (id_tarifa_aplicada) REFERENCES tarifas(id_tarifa)
);

-- -------------------------------------------------------------
-- PAGOS
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS pagos (
    id_pago       INT AUTO_INCREMENT PRIMARY KEY,
    id_registro   INT NOT NULL,
    monto_total   DECIMAL(10,2) NOT NULL,
    metodo_pago   ENUM('efectivo','qr') NOT NULL,
    fecha_hora_pago DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    id_caja       INT DEFAULT NULL,
    FOREIGN KEY (id_registro) REFERENCES registros_estacionamiento(id_registro),
    FOREIGN KEY (id_caja)     REFERENCES cajas(id_caja)
);

-- -------------------------------------------------------------
-- MOVIMIENTOS DE CAJA
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS movimientos_caja (
    id_movimiento INT AUTO_INCREMENT PRIMARY KEY,
    id_caja       INT NOT NULL,
    tipo          ENUM('INGRESO','EGRESO') NOT NULL,
    concepto      VARCHAR(100) NOT NULL,
    monto         DECIMAL(10,2) NOT NULL,
    metodo_pago   ENUM('EFECTIVO','QR') NOT NULL DEFAULT 'EFECTIVO',
    referencia    VARCHAR(100) DEFAULT NULL,
    fecha_hora    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    id_usuario    INT NOT NULL,
    id_pago       INT DEFAULT NULL,
    FOREIGN KEY (id_caja)    REFERENCES cajas(id_caja),
    FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario),
    FOREIGN KEY (id_pago)    REFERENCES pagos(id_pago)
);

-- -------------------------------------------------------------
-- CONFIGURACIÓN DEL NEGOCIO
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS configuracion (
    clave      VARCHAR(60) PRIMARY KEY,
    valor      TEXT NOT NULL,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- -------------------------------------------------------------
-- AUDITORÍA
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS auditoria (
    id          INT AUTO_INCREMENT PRIMARY KEY,
    id_usuario  INT NOT NULL,
    accion      VARCHAR(80) NOT NULL,
    tabla       VARCHAR(50) DEFAULT NULL,
    registro_id VARCHAR(30) DEFAULT NULL,
    detalle     TEXT,
    ip          VARCHAR(45) DEFAULT NULL,
    fecha       DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
);

-- =============================================================
-- ÍNDICES DE RENDIMIENTO
-- =============================================================
CREATE INDEX idx_vehiculos_id_cliente        ON vehiculos(id_cliente);
CREATE INDEX idx_registros_espacio_estado    ON registros_estacionamiento(espacio_id, estado);
CREATE INDEX idx_registros_fecha_salida      ON registros_estacionamiento(fecha_hora_salida);
CREATE INDEX idx_registros_id_cliente        ON registros_estacionamiento(id_cliente);
CREATE INDEX idx_registros_estado            ON registros_estacionamiento(estado);
CREATE INDEX idx_cajas_estado                ON cajas(estado);
CREATE INDEX idx_clientes_nombre             ON clientes(nombre);
CREATE INDEX idx_espacios_activo             ON espacios(activo);
CREATE INDEX idx_tarifas_tipo                ON tarifas(tipo_vehiculo);
CREATE INDEX idx_movimientos_caja_tipo       ON movimientos_caja(tipo);
CREATE INDEX idx_movimientos_caja_caja       ON movimientos_caja(id_caja);
CREATE INDEX idx_pagos_metodo                ON pagos(metodo_pago);
CREATE INDEX idx_pagos_id_caja               ON pagos(id_caja);
CREATE INDEX idx_auditoria_fecha             ON auditoria(fecha);
CREATE INDEX idx_auditoria_usuario           ON auditoria(id_usuario);

-- =============================================================
-- DATOS INICIALES (SEED)
-- =============================================================

-- Categorías por defecto
INSERT IGNORE INTO categorias (nombre, descripcion, costo_por_hora, fraccion_minima, icono) VALUES
('Carro',     'Automóviles de 4 ruedas',       3.00, 15, '🚗'),
('Moto',      'Motocicletas y ciclomotores',    1.50, 15, '🏍️'),
('Camioneta', 'Camionetas y vehículos SUV',     5.00, 15, '🚙');

-- Tarifas (una por categoría)
INSERT IGNORE INTO tarifas (tipo_vehiculo, id_categoria, costo_por_hora, fraccion_minima)
SELECT LOWER(c.nombre), c.id_categoria, c.costo_por_hora, c.fraccion_minima
FROM categorias c;

-- Espacios del parqueadero
INSERT IGNORE INTO espacios (id_espacio, tipo, fila, numero, pos_x, pos_y) VALUES
('A1','carro','A',1,  20,  20), ('A2','carro','A',2, 122,  20), ('A3','carro','A',3, 224,  20),
('A4','carro','A',4, 326,  20), ('A5','carro','A',5, 428,  20),
('B1','carro','B',1,  20, 132), ('B2','carro','B',2, 122, 132), ('B3','carro','B',3, 224, 132),
('B4','carro','B',4, 326, 132), ('B5','carro','B',5, 428, 132),
('C1','carro','C',1,  20, 244), ('C2','carro','C',2, 122, 244), ('C3','carro','C',3, 224, 244),
('C4','carro','C',4, 326, 244), ('C5','carro','C',5, 428, 244),
('M1','moto','M',1,  20, 376), ('M2','moto','M',2, 102, 376),
('M3','moto','M',3, 184, 376), ('M4','moto','M',4, 266, 376);

-- Configuración por defecto
INSERT IGNORE INTO configuracion (clave, valor) VALUES
('nombre_negocio',      'Parqueadero Smart'),
('direccion',           ''),
('telefono',            ''),
('nit',                 ''),
('moneda',              'Bs'),
('alerta_horas',        '8'),
('tarifa_minima_horas', '0'),
('color_primario',      '#dc2814');
