-- ============================================
-- Trazabilidad de Lentes - Convenio Óptica/Hospital
-- Base de datos: convenio_lentes
-- ============================================

CREATE DATABASE IF NOT EXISTS convenio_lentes DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE convenio_lentes;

-- ── PACIENTES ──
CREATE TABLE IF NOT EXISTS pacientes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(200) NOT NULL,
    rut VARCHAR(15) NOT NULL,
    fecha_nacimiento DATE NULL,
    edad INT NULL,
    ciudad VARCHAR(100) NULL,
    telefono VARCHAR(20) NULL,
    email VARCHAR(150) NULL,
    prevision VARCHAR(100) NULL,
    observaciones TEXT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_rut (rut),
    INDEX idx_nombre (nombre)
) ENGINE=InnoDB;

-- ── RECETAS ──
CREATE TABLE IF NOT EXISTS recetas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    paciente_id INT NOT NULL,
    fecha_receta DATE NOT NULL,
    medico VARCHAR(150) NULL,
    diagnostico TEXT NULL,
    -- Ojo Derecho (OD)
    od_esfera VARCHAR(10) NULL,
    od_cilindro VARCHAR(10) NULL,
    od_eje VARCHAR(10) NULL,
    od_adicion VARCHAR(10) NULL,
    od_dp VARCHAR(10) NULL,
    -- Ojo Izquierdo (OI)
    oi_esfera VARCHAR(10) NULL,
    oi_cilindro VARCHAR(10) NULL,
    oi_eje VARCHAR(10) NULL,
    oi_adicion VARCHAR(10) NULL,
    oi_dp VARCHAR(10) NULL,
    tipo_lente ENUM('lejos','cerca','bifocal','multifocal') NULL,
    observaciones TEXT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (paciente_id) REFERENCES pacientes(id) ON DELETE CASCADE,
    INDEX idx_paciente (paciente_id)
) ENGINE=InnoDB;

-- ── FOTOS DE RECETAS ──
CREATE TABLE IF NOT EXISTS receta_fotos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    receta_id INT NOT NULL,
    foto_path VARCHAR(500) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (receta_id) REFERENCES recetas(id) ON DELETE CASCADE,
    INDEX idx_receta (receta_id)
) ENGINE=InnoDB;

-- ── CATÁLOGO DE ARMAZONES ──
CREATE TABLE IF NOT EXISTS armazones (
    id INT AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(50) NULL,
    marca VARCHAR(100) NOT NULL,
    modelo VARCHAR(100) NULL,
    color VARCHAR(50) NULL,
    material VARCHAR(50) NULL,
    precio DECIMAL(10,2) NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_marca (marca)
) ENGINE=InnoDB;

-- ── CATÁLOGO DE TIPOS DE CRISTALES ──
CREATE TABLE IF NOT EXISTS tipo_cristales (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(150) NOT NULL,
    descripcion TEXT NULL,
    material VARCHAR(100) NULL,
    tratamiento VARCHAR(150) NULL,
    precio DECIMAL(10,2) NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- ── ÓRDENES ──
CREATE TABLE IF NOT EXISTS ordenes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    paciente_id INT NOT NULL,
    receta_id INT NULL,
    armazon_id INT NULL,
    tipo_cristal_id INT NULL,
    armazon_descripcion VARCHAR(300) NULL COMMENT 'Descripción manual del armazón si no viene de catálogo',
    cristal_descripcion VARCHAR(300) NULL COMMENT 'Descripción manual del cristal si no viene de catálogo',
    fecha_seleccion DATETIME NOT NULL COMMENT 'Fecha y hora de selección del armazón',
    fecha_entrega_estimada DATE NULL,
    fecha_entrega_real DATETIME NULL,
    estado ENUM('pendiente','en_proceso','listo','entregado','anulado') NOT NULL DEFAULT 'pendiente',
    observaciones TEXT NULL,
    usuario_id INT NOT NULL COMMENT 'Usuario que registró la orden',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (paciente_id) REFERENCES pacientes(id),
    FOREIGN KEY (receta_id) REFERENCES recetas(id) ON DELETE SET NULL,
    FOREIGN KEY (armazon_id) REFERENCES armazones(id) ON DELETE SET NULL,
    FOREIGN KEY (tipo_cristal_id) REFERENCES tipo_cristales(id) ON DELETE SET NULL,
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    INDEX idx_paciente (paciente_id),
    INDEX idx_estado (estado),
    INDEX idx_fecha_entrega (fecha_entrega_estimada)
) ENGINE=InnoDB;

-- ── LOG DE ACTIVIDAD ──
CREATE TABLE IF NOT EXISTS log_actividad (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NULL,
    accion VARCHAR(100) NOT NULL,
    detalle TEXT NULL,
    ip VARCHAR(45) NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_usuario (usuario_id),
    INDEX idx_fecha (created_at)
) ENGINE=InnoDB;

-- ── DATOS INICIALES DE EJEMPLO (CATÁLOGOS) ──
INSERT INTO armazones (codigo, marca, modelo, color, material, precio) VALUES
('ARM-001', 'Genérico', 'Modelo A', 'Negro', 'Acetato', 0),
('ARM-002', 'Genérico', 'Modelo B', 'Café', 'Metal', 0),
('ARM-003', 'Genérico', 'Modelo C', 'Transparente', 'TR90', 0);

INSERT INTO tipo_cristales (nombre, descripcion, material, tratamiento, precio) VALUES
('Monofocal CR39', 'Cristal monofocal estándar', 'CR39', 'Antireflejo', 0),
('Monofocal Policarbonato', 'Cristal monofocal resistente a impactos', 'Policarbonato', 'Antireflejo', 0),
('Bifocal CR39', 'Cristal bifocal estándar', 'CR39', 'Antireflejo', 0),
('Multifocal CR39', 'Cristal progresivo estándar', 'CR39', 'Antireflejo + Blue Cut', 0),
('Multifocal Free Form', 'Cristal progresivo digital', 'CR39', 'Antireflejo + Blue Cut + Fotocromático', 0);
