-- ============================================================
-- VÖLIÁ SYSTEMS - Esquema de base de datos
-- MySQL / MariaDB
-- ============================================================

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

-- ---------- Departamentos ----------
CREATE TABLE departamentos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    slug VARCHAR(50) UNIQUE NOT NULL,      -- compras, ventas, rrhh, admin_gestion, it, marketing, personal, atencion_cliente, logistica, financiero_contable, ceo
    nombre VARCHAR(100) NOT NULL,
    icono VARCHAR(50) DEFAULT NULL,
    activo TINYINT(1) DEFAULT 1
);

INSERT INTO departamentos (slug, nombre, icono) VALUES
('ceo', 'Dirección General', 'crown'),
('compras', 'Compras', 'shopping-cart'),
('ventas', 'Ventas', 'trending-up'),
('rrhh', 'Recursos Humanos', 'users'),
('admin_gestion', 'Administración y Gestión', 'briefcase'),
('it', 'IT', 'cpu'),
('marketing', 'Marketing', 'megaphone'),
('personal', 'Personal', 'user'),
('atencion_cliente', 'Atención al Cliente', 'headphones'),
('logistica', 'Logística', 'truck'),
('financiero_contable', 'Financiero y Contable', 'calculator');

-- ---------- Roles ----------
CREATE TABLE roles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    slug VARCHAR(50) UNIQUE NOT NULL,   -- ceo, jefe_departamento, empleado, admin_sistema
    nombre VARCHAR(100) NOT NULL
);

INSERT INTO roles (slug, nombre) VALUES
('ceo', 'CEO'),
('jefe_departamento', 'Jefe de Departamento'),
('empleado', 'Empleado'),
('admin_sistema', 'Administrador de Sistema');

-- ---------- Usuarios (cada empleado, cuenta individual) ----------
CREATE TABLE usuarios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    apellidos VARCHAR(150) NOT NULL,
    email VARCHAR(150) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    departamento_id INT NOT NULL,
    rol_id INT NOT NULL,
    avatar_url VARCHAR(255) DEFAULT NULL,
    estado ENUM('activo','pausado','eliminado') DEFAULT 'activo',
    tema_preferido ENUM('light','dark') DEFAULT 'dark',
    creado_en DATETIME DEFAULT CURRENT_TIMESTAMP,
    ultimo_acceso DATETIME DEFAULT NULL,
    FOREIGN KEY (departamento_id) REFERENCES departamentos(id),
    FOREIGN KEY (rol_id) REFERENCES roles(id)
);

-- ---------- Fichajes ----------
CREATE TABLE fichajes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NOT NULL,
    fecha DATE NOT NULL,
    hora_entrada DATETIME DEFAULT NULL,
    hora_salida DATETIME DEFAULT NULL,
    segundos_trabajados INT DEFAULT 0,     -- total neto (descontando descansos)
    estado ENUM('trabajando','en_descanso','finalizado') DEFAULT 'trabajando',
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
);

CREATE TABLE fichaje_descansos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    fichaje_id INT NOT NULL,
    inicio DATETIME NOT NULL,
    fin DATETIME DEFAULT NULL,
    FOREIGN KEY (fichaje_id) REFERENCES fichajes(id)
);

-- ---------- Agenda: tareas individuales ----------
CREATE TABLE tareas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NOT NULL,
    titulo VARCHAR(200) NOT NULL,
    descripcion TEXT,
    fecha_limite DATETIME DEFAULT NULL,
    prioridad ENUM('baja','media','alta') DEFAULT 'media',
    estado ENUM('pendiente','en_curso','completada') DEFAULT 'pendiente',
    creado_en DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
);

-- ---------- Comunicaciones generales (agenda / anuncios) ----------
CREATE TABLE comunicaciones (
    id INT AUTO_INCREMENT PRIMARY KEY,
    autor_id INT NOT NULL,
    titulo VARCHAR(200) NOT NULL,
    contenido TEXT NOT NULL,
    departamento_destino INT DEFAULT NULL,  -- NULL = toda la empresa
    creado_en DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (autor_id) REFERENCES usuarios(id),
    FOREIGN KEY (departamento_destino) REFERENCES departamentos(id)
);

-- ---------- Noticias ----------
CREATE TABLE noticias (
    id INT AUTO_INCREMENT PRIMARY KEY,
    autor_id INT NOT NULL,
    titulo VARCHAR(200) NOT NULL,
    resumen VARCHAR(400),
    contenido TEXT NOT NULL,
    imagen_url VARCHAR(255),
    publicado_en DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (autor_id) REFERENCES usuarios(id)
);

-- ---------- Proyectos ----------
CREATE TABLE proyectos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(200) NOT NULL,
    descripcion TEXT,
    departamento_id INT DEFAULT NULL,
    responsable_id INT DEFAULT NULL,
    estado ENUM('planificado','en_curso','pausado','finalizado') DEFAULT 'planificado',
    fecha_inicio DATE,
    fecha_fin DATE,
    FOREIGN KEY (departamento_id) REFERENCES departamentos(id),
    FOREIGN KEY (responsable_id) REFERENCES usuarios(id)
);

CREATE TABLE proyecto_tareas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    proyecto_id INT NOT NULL,
    titulo VARCHAR(200) NOT NULL,
    asignado_a INT DEFAULT NULL,
    estado ENUM('pendiente','en_curso','completada') DEFAULT 'pendiente',
    fecha_limite DATE,
    FOREIGN KEY (proyecto_id) REFERENCES proyectos(id),
    FOREIGN KEY (asignado_a) REFERENCES usuarios(id)
);

-- ---------- Pipeline (ventas / oportunidades) ----------
CREATE TABLE pipeline_etapas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    orden INT NOT NULL
);
INSERT INTO pipeline_etapas (nombre, orden) VALUES
('Nuevo lead',1),('Contactado',2),('Propuesta enviada',3),('Negociación',4),('Ganado',5),('Perdido',6);

CREATE TABLE pipeline_oportunidades (
    id INT AUTO_INCREMENT PRIMARY KEY,
    cliente_id INT DEFAULT NULL,
    titulo VARCHAR(200) NOT NULL,
    valor_estimado DECIMAL(12,2) DEFAULT 0,
    etapa_id INT NOT NULL,
    responsable_id INT DEFAULT NULL,
    creado_en DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (etapa_id) REFERENCES pipeline_etapas(id),
    FOREIGN KEY (responsable_id) REFERENCES usuarios(id)
);

-- ---------- Clientes / Contactos ----------
CREATE TABLE clientes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(200) NOT NULL,
    cif_nif VARCHAR(30),
    direccion VARCHAR(255),
    email VARCHAR(150),
    telefono VARCHAR(30),
    notas TEXT,
    creado_en DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE contactos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    cliente_id INT DEFAULT NULL,
    nombre VARCHAR(150) NOT NULL,
    cargo VARCHAR(100),
    email VARCHAR(150),
    telefono VARCHAR(30),
    notas TEXT,
    FOREIGN KEY (cliente_id) REFERENCES clientes(id)
);

-- ---------- Repositorio de documentos ----------
CREATE TABLE repositorio (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre_archivo VARCHAR(255) NOT NULL,
    ruta VARCHAR(255) NOT NULL,
    departamento_id INT DEFAULT NULL,
    subido_por INT NOT NULL,
    subido_en DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (departamento_id) REFERENCES departamentos(id),
    FOREIGN KEY (subido_por) REFERENCES usuarios(id)
);

-- ---------- Contabilidad: cuentas contables (PGC simplificado) ----------
CREATE TABLE cuentas_contables (
    id INT AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(10) NOT NULL UNIQUE,   -- ej. 700, 430, 572...
    nombre VARCHAR(150) NOT NULL,
    tipo ENUM('activo','pasivo','ingreso','gasto','patrimonio') NOT NULL
);
INSERT INTO cuentas_contables (codigo,nombre,tipo) VALUES
('430','Clientes','activo'),
('400','Proveedores','pasivo'),
('700','Ventas de mercaderías','ingreso'),
('600','Compras de mercaderías','gasto'),
('472','H.P. IVA soportado','activo'),
('477','H.P. IVA repercutido','pasivo'),
('572','Bancos','activo');

-- ---------- Facturas (emitidas y recibidas) ----------
CREATE TABLE facturas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    tipo ENUM('emitida','recibida') NOT NULL,
    numero VARCHAR(50) NOT NULL,
    cliente_id INT DEFAULT NULL,
    proveedor_nombre VARCHAR(200) DEFAULT NULL,
    fecha DATE NOT NULL,
    base_imponible DECIMAL(12,2) NOT NULL,
    iva_porcentaje DECIMAL(5,2) DEFAULT 21.00,
    total DECIMAL(12,2) NOT NULL,
    archivo_ruta VARCHAR(255) DEFAULT NULL,
    estado ENUM('pendiente','pagada','vencida') DEFAULT 'pendiente',
    creado_por INT NOT NULL,
    creado_en DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (cliente_id) REFERENCES clientes(id),
    FOREIGN KEY (creado_por) REFERENCES usuarios(id)
);

-- ---------- Asientos contables (generados automáticamente al crear/subir factura) ----------
CREATE TABLE asientos_contables (
    id INT AUTO_INCREMENT PRIMARY KEY,
    factura_id INT DEFAULT NULL,
    fecha DATE NOT NULL,
    descripcion VARCHAR(255) NOT NULL,
    creado_en DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (factura_id) REFERENCES facturas(id)
);

CREATE TABLE asiento_lineas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    asiento_id INT NOT NULL,
    cuenta_id INT NOT NULL,
    debe DECIMAL(12,2) DEFAULT 0,
    haber DECIMAL(12,2) DEFAULT 0,
    FOREIGN KEY (asiento_id) REFERENCES asientos_contables(id),
    FOREIGN KEY (cuenta_id) REFERENCES cuentas_contables(id)
);

-- ---------- Reuniones ----------
CREATE TABLE reuniones (
    id INT AUTO_INCREMENT PRIMARY KEY,
    titulo VARCHAR(200) NOT NULL,
    descripcion TEXT,
    fecha_hora DATETIME NOT NULL,
    duracion_min INT DEFAULT 30,
    organizador_id INT NOT NULL,
    enlace VARCHAR(255) DEFAULT NULL,
    FOREIGN KEY (organizador_id) REFERENCES usuarios(id)
);

CREATE TABLE reunion_asistentes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    reunion_id INT NOT NULL,
    usuario_id INT NOT NULL,
    confirmado TINYINT(1) DEFAULT 0,
    FOREIGN KEY (reunion_id) REFERENCES reuniones(id),
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
);

-- ---------- Usuario CEO inicial (password: Atlas2026! -- CAMBIAR TRAS PRIMER LOGIN) ----------
-- El hash se genera en PHP con password_hash(); este es solo un placeholder de ejemplo.
-- INSERT INTO usuarios (nombre, apellidos, email, password_hash, departamento_id, rol_id)
-- VALUES ('Admin','CEO','ceo@volia.com', '$2y$10$REEMPLAZAR_HASH', 1, 1);
