CREATE TABLE IF NOT EXISTS categorias (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    parent_id BIGINT UNSIGNED NULL,
    nombre VARCHAR(120) NOT NULL,
    slug VARCHAR(140) NOT NULL UNIQUE,
    descripcion VARCHAR(255) NULL,
    tipo_stock ENUM('unidad', 'peso', 'longitud', 'pieza_mixta') NOT NULL DEFAULT 'unidad',
    orden_visual INT NOT NULL DEFAULT 0,
    activa TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_categorias_parent FOREIGN KEY (parent_id) REFERENCES categorias (id) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS productos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    categoria_id BIGINT UNSIGNED NOT NULL,
    nombre VARCHAR(160) NOT NULL,
    slug VARCHAR(180) NOT NULL UNIQUE,
    sku_base VARCHAR(60) NOT NULL UNIQUE,
    descripcion_corta VARCHAR(255) NULL,
    descripcion_larga TEXT NULL,
    marca VARCHAR(100) NULL,
    material_principal VARCHAR(100) NULL,
    unidad_medida ENUM('unidad', 'kg', 'gr', 'metro', 'cm', 'pieza') NOT NULL DEFAULT 'unidad',
    permite_variantes TINYINT(1) NOT NULL DEFAULT 0,
    controla_stock TINYINT(1) NOT NULL DEFAULT 1,
    stock_minimo DECIMAL(12,3) NOT NULL DEFAULT 0.000,
    stock_maximo_recomendado DECIMAL(12,3) NULL,
    precio_referencia DECIMAL(12,2) NULL,
    costo_referencia DECIMAL(12,2) NULL,
    ubicacion_referencia VARCHAR(80) NULL,
    notas_internas TEXT NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_productos_categoria_activo (categoria_id, activo),
    CONSTRAINT fk_productos_categoria FOREIGN KEY (categoria_id) REFERENCES categorias (id) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS producto_variantes (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    producto_id BIGINT UNSIGNED NOT NULL,
    sku VARCHAR(80) NOT NULL UNIQUE,
    atributo_1_nombre VARCHAR(50) NULL,
    atributo_1_valor VARCHAR(50) NULL,
    atributo_2_nombre VARCHAR(50) NULL,
    atributo_2_valor VARCHAR(50) NULL,
    atributo_3_nombre VARCHAR(50) NULL,
    atributo_3_valor VARCHAR(50) NULL,
    peso_unitario_kg DECIMAL(10,3) NULL,
    longitud_cm DECIMAL(10,2) NULL,
    stock_minimo DECIMAL(12,3) NULL,
    precio_referencia DECIMAL(12,2) NULL,
    activa TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_variantes_producto_activa (producto_id, activa),
    CONSTRAINT fk_variantes_producto FOREIGN KEY (producto_id) REFERENCES productos (id) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS inventario_stock (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    producto_id BIGINT UNSIGNED NOT NULL,
    variante_id BIGINT UNSIGNED NULL,
    deposito VARCHAR(80) NOT NULL DEFAULT 'local_principal',
    cantidad_actual DECIMAL(12,3) NOT NULL DEFAULT 0.000,
    cantidad_reservada DECIMAL(12,3) NOT NULL DEFAULT 0.000,
    cantidad_disponible DECIMAL(12,3) AS (cantidad_actual - cantidad_reservada) STORED,
    ultima_actualizacion DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_stock_item (producto_id, variante_id, deposito),
    CONSTRAINT fk_stock_producto FOREIGN KEY (producto_id) REFERENCES productos (id) ON DELETE RESTRICT ON UPDATE CASCADE,
    CONSTRAINT fk_stock_variante FOREIGN KEY (variante_id) REFERENCES producto_variantes (id) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS usuarios (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(120) NOT NULL,
    email VARCHAR(160) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    rol ENUM('admin', 'encargado', 'operador', 'consulta') NOT NULL DEFAULT 'operador',
    alcance_admin ENUM('total') NULL,
    ultimo_login_at DATETIME NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS inventario_movimientos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tipo_movimiento ENUM('alta_inicial', 'compra', 'ajuste_positivo', 'ajuste_negativo', 'venta_manual', 'devolucion', 'merma', 'correccion') NOT NULL,
    referencia_externa VARCHAR(100) NULL,
    motivo VARCHAR(255) NOT NULL,
    observaciones TEXT NULL,
    realizado_por BIGINT UNSIGNED NOT NULL,
    fecha_movimiento DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_movimientos_fecha (fecha_movimiento),
    CONSTRAINT fk_movimientos_usuario FOREIGN KEY (realizado_por) REFERENCES usuarios (id) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS inventario_movimiento_detalle (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    movimiento_id BIGINT UNSIGNED NOT NULL,
    producto_id BIGINT UNSIGNED NOT NULL,
    variante_id BIGINT UNSIGNED NULL,
    deposito VARCHAR(80) NOT NULL DEFAULT 'local_principal',
    cantidad DECIMAL(12,3) NOT NULL,
    stock_antes DECIMAL(12,3) NOT NULL,
    stock_despues DECIMAL(12,3) NOT NULL,
    costo_unitario DECIMAL(12,2) NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_movimiento_detalle_item (producto_id, variante_id),
    CONSTRAINT fk_detalle_movimiento FOREIGN KEY (movimiento_id) REFERENCES inventario_movimientos (id) ON DELETE RESTRICT ON UPDATE CASCADE,
    CONSTRAINT fk_detalle_producto FOREIGN KEY (producto_id) REFERENCES productos (id) ON DELETE RESTRICT ON UPDATE CASCADE,
    CONSTRAINT fk_detalle_variante FOREIGN KEY (variante_id) REFERENCES producto_variantes (id) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS auditoria_eventos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    usuario_id BIGINT UNSIGNED NULL,
    modulo VARCHAR(60) NOT NULL,
    accion VARCHAR(80) NOT NULL,
    entidad VARCHAR(80) NOT NULL,
    entidad_id BIGINT UNSIGNED NULL,
    ip_origen VARCHAR(45) NULL,
    user_agent VARCHAR(255) NULL,
    payload_resumen JSON NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_auditoria_modulo_accion_fecha (modulo, accion, created_at),
    CONSTRAINT fk_auditoria_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;