/*
  # Creación de tablas para API Seguros
  
  1. Tablas principales
    - `configuraciones` - Configuraciones del sistema
    - `transacciones` - Registro de todas las transacciones
    - `productos_seguros` - Catálogo de productos/coberturas
    - `otp_validaciones` - Códigos OTP generados
    - `documentos_polizas` - Documentos generados
    - `usuarios_api` - Usuarios del sistema de administración
    
  2. Seguridad
    - Todas las tablas tienen timestamps
    - Índices optimizados para consultas frecuentes
    - Campos de auditoría
*/

-- Tabla de configuraciones del sistema
CREATE TABLE IF NOT EXISTS configuraciones (
    id INT AUTO_INCREMENT PRIMARY KEY,
    clave VARCHAR(100) NOT NULL UNIQUE,
    valor TEXT,
    descripcion TEXT,
    activo TINYINT(1) DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- Tabla de productos/tipos de seguros
CREATE TABLE IF NOT EXISTS productos_seguros (
    id INT AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(50) NOT NULL UNIQUE,
    nombre VARCHAR(200) NOT NULL,
    descripcion TEXT,
    tipo_vehiculo ENUM('automovil', 'motocicleta') NOT NULL,
    tipo_seguro ENUM('ley') DEFAULT 'ley',
    cobertura_1 DECIMAL(12,2) DEFAULT 250000.00,
    cobertura_2 DECIMAL(12,2) DEFAULT 250000.00,
    precio_base DECIMAL(10,2) NOT NULL,
    precio_grua DECIMAL(10,2) DEFAULT 0.00,
    precio_casa_conductor DECIMAL(10,2) DEFAULT 0.00,
    activo TINYINT(1) DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_tipo_vehiculo (tipo_vehiculo),
    INDEX idx_activo (activo)
);

-- Tabla de transacciones principales
CREATE TABLE IF NOT EXISTS transacciones (
    id INT AUTO_INCREMENT PRIMARY KEY,
    uuid VARCHAR(36) NOT NULL UNIQUE,
    disashop_id VARCHAR(100) NULL,
    estado ENUM('iniciada', 'datos_validados', 'otp_enviado', 'otp_validado', 'pago_pendiente', 'pago_procesado', 'poliza_emitida', 'completada', 'cancelada', 'error') DEFAULT 'iniciada',
    
    -- Datos del cliente
    cedula VARCHAR(50) NOT NULL,
    nombre_completo VARCHAR(500),
    telefono VARCHAR(20) NOT NULL,
    
    -- Datos del vehículo
    placa VARCHAR(20) NOT NULL,
    marca VARCHAR(100),
    modelo VARCHAR(100),
    año INT,
    chasis VARCHAR(100),
    
    -- Datos del seguro
    producto_seguro_id INT,
    aseguradora VARCHAR(100) DEFAULT 'dominicana_seguros',
    incluye_grua TINYINT(1) DEFAULT 0,
    incluye_casa_conductor TINYINT(1) DEFAULT 0,
    monto_total DECIMAL(10,2) NOT NULL,
    
    -- Datos de la póliza (cuando se emite)
    numero_cotizacion VARCHAR(100) NULL,
    numero_poliza VARCHAR(100) NULL,
    fecha_emision DATE NULL,
    fecha_vencimiento DATE NULL,
    
    -- Metadatos
    ip_cliente VARCHAR(45),
    user_agent TEXT,
    datos_adicionales JSON,
    
    -- Auditoría
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    completed_at TIMESTAMP NULL,
    
    FOREIGN KEY (producto_seguro_id) REFERENCES productos_seguros(id),
    INDEX idx_cedula (cedula),
    INDEX idx_placa (placa),
    INDEX idx_estado (estado),
    INDEX idx_fecha_creacion (created_at),
    INDEX idx_aseguradora (aseguradora),
    INDEX idx_telefono (telefono)
);

-- Tabla de validaciones OTP
CREATE TABLE IF NOT EXISTS otp_validaciones (
    id INT AUTO_INCREMENT PRIMARY KEY,
    transaccion_id INT NOT NULL,
    codigo VARCHAR(10) NOT NULL,
    telefono VARCHAR(20) NOT NULL,
    intentos INT DEFAULT 0,
    max_intentos INT DEFAULT 3,
    validado TINYINT(1) DEFAULT 0,
    expira_at TIMESTAMP NULL,
    validado_at TIMESTAMP NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (transaccion_id) REFERENCES transacciones(id) ON DELETE CASCADE,
    INDEX idx_transaccion (transaccion_id),
    INDEX idx_codigo (codigo),
    INDEX idx_telefono (telefono),
    INDEX idx_expiracion (expira_at)
);

-- Tabla de documentos generados
CREATE TABLE IF NOT EXISTS documentos_polizas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    transaccion_id INT NOT NULL,
    tipo_documento ENUM('poliza', 'carnet_digital', 'certificado') NOT NULL,
    nombre_archivo VARCHAR(255) NOT NULL,
    ruta_archivo VARCHAR(500) NOT NULL,
    url_publica VARCHAR(500) NULL,
    url_corta VARCHAR(100) NULL,
    tamaño_archivo INT NULL,
    mime_type VARCHAR(100) NULL,
    enviado_sms TINYINT(1) DEFAULT 0,
    enviado_at TIMESTAMP NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (transaccion_id) REFERENCES transacciones(id) ON DELETE CASCADE,
    INDEX idx_transaccion (transaccion_id),
    INDEX idx_tipo (tipo_documento),
    INDEX idx_enviado (enviado_sms)
);

-- Tabla de logs del sistema
CREATE TABLE IF NOT EXISTS system_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    transaccion_id INT NULL,
    nivel ENUM('debug', 'info', 'warning', 'error', 'critical') DEFAULT 'info',
    mensaje TEXT NOT NULL,
    contexto JSON NULL,
    archivo VARCHAR(255) NULL,
    linea INT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (transaccion_id) REFERENCES transacciones(id) ON DELETE SET NULL,
    INDEX idx_transaccion (transaccion_id),
    INDEX idx_nivel (nivel),
    INDEX idx_fecha (created_at)
);

-- Tabla de sesiones de usuarios
CREATE TABLE IF NOT EXISTS sesiones_admin (
    id VARCHAR(128) PRIMARY KEY,
    usuario_id INT NOT NULL,
    ip_address VARCHAR(45) NOT NULL,
    user_agent TEXT,
    datos JSON,
    expires_at TIMESTAMP NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (usuario_id) REFERENCES usuarios_admin(id) ON DELETE CASCADE,
    INDEX idx_usuario (usuario_id),
    INDEX idx_expiracion (expires_at)
);

-- Insertar configuraciones iniciales
INSERT INTO configuraciones (clave, valor, descripcion) VALUES
('dominicana_api_url', 'https://apptest.dominicanadeseguros.com:9443/apidomiapp', 'URL base del API de Dominicana de Seguros'),
('dominicana_api_ventas_url', 'https://apptest.dominicanadeseguros.com:9443/apiventasdcs/api', 'URL del API de ventas de Dominicana de Seguros'),
('dominicana_usuario', 'PRODUCTOR', 'Usuario para autenticación con Dominicana de Seguros'),
('dominicana_password', 'abc@123', 'Contraseña para autenticación con Dominicana de Seguros'),
('sms_gateway_url', '', 'URL del gateway de SMS'),
('sms_gateway_token', '', 'Token de autenticación para SMS'),
('otp_expiration_minutes', '10', 'Tiempo de expiración del código OTP en minutos'),
('transaction_timeout_minutes', '30', 'Tiempo límite para completar una transacción'),
('shortlink_base_url', '', 'URL base para generar links cortos'),
('documents_storage_path', '/var/www/segurosapi/storage/documents', 'Ruta para almacenar documentos'),
('app_name', 'Seguros API', 'Nombre de la aplicación'),
('app_version', '1.0.0', 'Versión de la aplicación');

-- Insertar productos de seguros iniciales
INSERT INTO productos_seguros (codigo, nombre, descripcion, tipo_vehiculo, cobertura_1, cobertura_2, precio_base, precio_grua, precio_casa_conductor) VALUES
('AUTO_LEY_C1', 'Automóvil Seguro de Ley Cobertura 1', 'Cobertura básica de ley para automóviles (250,000-250,000)', 'automovil', 250000.00, 250000.00, 2500.00, 500.00, 300.00),
('AUTO_LEY_C2', 'Automóvil Seguro de Ley Cobertura 2', 'Cobertura ampliada de ley para automóviles (500,000-500,000)', 'automovil', 500000.00, 500000.00, 3500.00, 500.00, 300.00),
('MOTO_LEY_C1', 'Motocicleta Seguro de Ley Cobertura 1', 'Cobertura básica de ley para motocicletas (250,000-250,000)', 'motocicleta', 250000.00, 250000.00, 1500.00, 300.00, 200.00),
('MOTO_LEY_C2', 'Motocicleta Seguro de Ley Cobertura 2', 'Cobertura ampliada de ley para motocicletas (500,000-500,000)', 'motocicleta', 500000.00, 500000.00, 2200.00, 300.00, 200.00);