CREATE DATABASE IF NOT EXISTS travel_mvp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE travel_mvp;

-- Tabla de usuarios/administradores
CREATE TABLE usuarios (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nombre VARCHAR(100) NOT NULL,
    email VARCHAR(150) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    telefono VARCHAR(20),
    tipo ENUM('admin', 'cliente') DEFAULT 'cliente',
    activo BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- Tabla de categorías de productos
CREATE TABLE categorias (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nombre VARCHAR(100) NOT NULL,
    descripcion TEXT,
    imagen VARCHAR(255),
    activo BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- Tabla de productos turísticos
CREATE TABLE productos (
    id INT PRIMARY KEY AUTO_INCREMENT,
    categoria_id INT,
    nombre VARCHAR(200) NOT NULL,
    descripcion TEXT,
    descripcion_corta VARCHAR(500),
    precio DECIMAL(10,2) NOT NULL,
    precio_descuento DECIMAL(10,2) NULL,
    duracion VARCHAR(50), -- ej: "3 días, 2 noches"
    incluye TEXT, -- JSON o texto de lo que incluye el paquete
    no_incluye TEXT, -- JSON o texto de lo que no incluye
    itinerario TEXT, -- JSON o texto del itinerario
    capacidad_maxima INT DEFAULT 20,
    dificultad ENUM('facil', 'moderado', 'dificil') DEFAULT 'facil',
    imagen_principal VARCHAR(255),
    galeria TEXT, -- JSON de array de imágenes
    activo BOOLEAN DEFAULT TRUE,
    destacado BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (categoria_id) REFERENCES categorias(id)
);

-- Tabla de disponibilidad de productos
CREATE TABLE disponibilidad (
    id INT PRIMARY KEY AUTO_INCREMENT,
    producto_id INT,
    fecha_salida DATE NOT NULL,
    fecha_regreso DATE NOT NULL,
    cupos_disponibles INT NOT NULL,
    cupos_reservados INT DEFAULT 0,
    precio_especial DECIMAL(10,2) NULL, -- precio especial para esa fecha
    activo BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (producto_id) REFERENCES productos(id),
    INDEX idx_fechas (fecha_salida, fecha_regreso),
    INDEX idx_producto_fecha (producto_id, fecha_salida)
);

-- Tabla de reservas/bookings
CREATE TABLE reservas (
    id INT PRIMARY KEY AUTO_INCREMENT,
    codigo_reserva VARCHAR(20) UNIQUE NOT NULL,
    producto_id INT,
    disponibilidad_id INT,
    
    -- Información del cliente
    cliente_nombre VARCHAR(150) NOT NULL,
    cliente_email VARCHAR(150) NOT NULL,
    cliente_telefono VARCHAR(20) NOT NULL,
    cliente_direccion TEXT,
    numero_personas INT NOT NULL DEFAULT 1,
    
    -- Información de la reserva
    fecha_reserva TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    fecha_salida DATE NOT NULL,
    fecha_regreso DATE NOT NULL,
    
    -- Precios
    precio_unitario DECIMAL(10,2) NOT NULL,
    precio_total DECIMAL(10,2) NOT NULL,
    descuento DECIMAL(10,2) DEFAULT 0,
    precio_final DECIMAL(10,2) NOT NULL,
    
    -- Estado y notas
    estado ENUM('pendiente', 'confirmada', 'pagada', 'cancelada') DEFAULT 'pendiente',
    metodo_pago VARCHAR(50), -- efectivo, transferencia, tarjeta, etc.
    notas_cliente TEXT,
    notas_admin TEXT,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (producto_id) REFERENCES productos(id),
    FOREIGN KEY (disponibilidad_id) REFERENCES disponibilidad(id),
    INDEX idx_codigo (codigo_reserva),
    INDEX idx_cliente (cliente_email),
    INDEX idx_fechas (fecha_salida, fecha_regreso),
    INDEX idx_estado (estado)
);

-- Tabla de mensajes/chat
CREATE TABLE mensajes (
    id INT PRIMARY KEY AUTO_INCREMENT,
    reserva_id INT NULL, -- Puede estar asociado a una reserva o ser consulta general
    nombre VARCHAR(100) NOT NULL,
    email VARCHAR(150) NOT NULL,
    telefono VARCHAR(20),
    asunto VARCHAR(200),
    mensaje TEXT NOT NULL,
    respuesta TEXT,
    estado ENUM('nuevo', 'leido', 'respondido') DEFAULT 'nuevo',
    es_admin BOOLEAN DEFAULT FALSE, -- true si el mensaje lo envía un admin
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (reserva_id) REFERENCES reservas(id),
    INDEX idx_estado (estado),
    INDEX idx_email (email)
);

-- Tabla de configuraciones del sistema
CREATE TABLE configuraciones (
    id INT PRIMARY KEY AUTO_INCREMENT,
    clave VARCHAR(100) UNIQUE NOT NULL,
    valor TEXT,
    descripcion VARCHAR(255),
    tipo ENUM('texto', 'numero', 'boolean', 'json') DEFAULT 'texto',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- Tabla de transportes/buses
CREATE TABLE transportes (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nombre VARCHAR(100) NOT NULL,
    tipo ENUM('autobus', 'van', 'avion', 'otro') DEFAULT 'autobus',
    capacidad INT NOT NULL,
    comodidades TEXT, -- JSON de comodidades (AC, WiFi, etc.)
    activo BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);