DROP DATABASE IF EXISTS laniacc;
CREATE DATABASE laniacc DEFAULT CHARACTER SET utf8mb4;
USE laniacc;

-- DDL -------------------------------------------------------------------------------------
CREATE TABLE genero (
  id_genero       TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  descripcion     VARCHAR(20) NOT NULL UNIQUE
) ENGINE=InnoDB;

CREATE TABLE rango_edad (
  id_rango_edad   TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  descripcion     VARCHAR(15) NOT NULL UNIQUE
) ENGINE=InnoDB;


CREATE TABLE tipo_identificacion (
  id_tipo_id      TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  descripcion     VARCHAR(50) NOT NULL UNIQUE
) ENGINE=InnoDB;

CREATE TABLE nivel_estudio (
  id_nivel        TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  descripcion     VARCHAR(50) NOT NULL UNIQUE
) ENGINE=InnoDB;

CREATE TABLE giro (
  id_giro         TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  descripcion     VARCHAR(100) NOT NULL UNIQUE
) ENGINE=InnoDB;

CREATE TABLE examen (
  id_examen       SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombre_examen   VARCHAR(150) NOT NULL UNIQUE
) ENGINE=InnoDB;


-- IMPORTAR BASE DE DATOS DE INEGI

-- Catalogo de motivos
CREATE TABLE motivo_examen (
    id INT AUTO_INCREMENT PRIMARY KEY,
    descripcion VARCHAR(255) NOT NULL UNIQUE
);

-- 1. TABLA CANDIDATO (datos básicos)
CREATE TABLE candidato (
  id_candidato       INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  fecha_entrada      DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  fecha_salida       DATETIME DEFAULT NULL,
  
  nombres            VARCHAR(100) NOT NULL,
  primer_apellido    VARCHAR(100) NOT NULL,
  segundo_apellido   VARCHAR(100) DEFAULT NULL,
  
  correo             VARCHAR(150) NOT NULL,
  telefono           VARCHAR(30) NOT NULL,
  
  id_examen          SMALLINT UNSIGNED NOT NULL,
  id_tipo_id         TINYINT UNSIGNED NOT NULL,
  id_rango_edad      TINYINT UNSIGNED NOT NULL,
  id_genero          TINYINT UNSIGNED NOT NULL,
  
  FOREIGN KEY (id_examen) REFERENCES examen(id_examen),
  FOREIGN KEY (id_tipo_id) REFERENCES tipo_identificacion(id_tipo_id),
  FOREIGN KEY (id_rango_edad) REFERENCES rango_edad(id_rango_edad),
  FOREIGN KEY (id_genero) REFERENCES genero(id_genero)
) ENGINE=InnoDB;

-- 2. TABLA INFO_CANDIDATOS (datos extendidos)
CREATE TABLE info_candidatos (
    id_candidato                 INT UNSIGNED PRIMARY KEY,

    id_pais                     INT NOT NULL,
    id_estado                   INT DEFAULT NULL,
    id_municipio                INT DEFAULT NULL,
    id_colonia                  INT	DEFAULT NULL,

    id_nivel                    TINYINT UNSIGNED NOT NULL,
    id_giro                     TINYINT UNSIGNED NOT NULL,

    nombre_empresa_institucion  VARCHAR(150) NOT NULL,
    id_motivo_examen            INT NOT NULL,

    calificacion_servicio       TINYINT NOT NULL,
    consentimiento_pub          TINYINT NOT NULL,
  
    FOREIGN KEY (id_candidato)  REFERENCES candidato(id_candidato)
    ON DELETE CASCADE,
    FOREIGN KEY (id_pais)       REFERENCES paises(id),
    FOREIGN KEY (id_estado)     REFERENCES estados(id),
    FOREIGN KEY (id_municipio)  REFERENCES municipios(id),
    FOREIGN KEY (id_colonia)    REFERENCES colonias(id),
    FOREIGN KEY (id_nivel)      REFERENCES nivel_estudio(id_nivel),
    FOREIGN KEY (id_giro)       REFERENCES giro(id_giro),
    FOREIGN KEY (id_motivo_examen) REFERENCES motivo_examen(id)
) ENGINE=InnoDB;

CREATE TABLE usuario (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario VARCHAR(150) UNIQUE NOT NULL,
    contrasena VARCHAR(255) NOT NULL
) ENGINE=InnoDB;


-- OAuth 2.0 
CREATE TABLE oauth_clients (
    client_id VARCHAR(80) NOT NULL,
    client_secret VARCHAR(80) NOT NULL,
    redirect_uri VARCHAR(2000) DEFAULT NULL,
    grant_types VARCHAR(80) DEFAULT NULL,
    scope VARCHAR(4000) DEFAULT NULL,
    user_id VARCHAR(80) DEFAULT NULL,
    PRIMARY KEY (client_id)
);

CREATE TABLE oauth_access_tokens (
    access_token VARCHAR(255) NOT NULL,
    client_id VARCHAR(80) NOT NULL,
    user_id VARCHAR(80) DEFAULT NULL,
    expires TIMESTAMP NOT NULL,
    scope VARCHAR(4000) DEFAULT NULL,
    PRIMARY KEY (access_token)
);


CREATE TABLE oauth_refresh_tokens (
    refresh_token VARCHAR(40) NOT NULL,
    client_id VARCHAR(80) NOT NULL,
    user_id VARCHAR(80) DEFAULT NULL,
    expires TIMESTAMP NOT NULL,
    scope VARCHAR(4000) DEFAULT NULL,
    PRIMARY KEY (refresh_token)
);

CREATE TABLE oauth_scopes (
    scope VARCHAR(80) NOT NULL,
    is_default BOOLEAN,
    PRIMARY KEY (scope)
);


-- DML -------------------------------------------------------------------------------------

-- Inserción catalogo "genero":
INSERT INTO genero (id_genero, descripcion) VALUES
(1, 'Masculino'),
(2, 'Femenino'),
(3, 'Prefiero no decir');

-- Inserción catalogo "rango_edad":
INSERT INTO rango_edad (id_rango_edad, descripcion) VALUES
(1, 'Menos de 18'),
(2, '18-24'),
(3, '24-34'),
(4, '35-44'),
(5, '44-54'),
(6, '55-64'),
(7, '65 o más');

-- Inserción catalogo "tipo_identificacion":
INSERT INTO tipo_identificacion (id_tipo_id, descripcion) VALUES
(1, 'Credencial de estudiante'),
(2, 'INE'),
(3, 'Pasaporte'),
(4, 'Licencia de conducir'),
(5, 'Cartilla militar');

-- Inserción catalogo "nivel_estudio":
INSERT INTO nivel_estudio (id_nivel, descripcion) VALUES
(1, 'Primaria'),
(2, 'Secundaria'),
(3, 'Bachillerato'),
(4, 'Técnico Superior Universitario'),
(5, 'Licenciatura'),
(6, 'Maestría'),
(7, 'Doctorado'),
(8, 'Otro');

-- Inserción catalogo "giro_empresa" considerando los giros de las empresas más comunes:
INSERT INTO giro (id_giro, descripcion) VALUES
(1, 'Tecnologías de la información'),
(2, 'Gobierno'),
(3, 'Finanzas'),
(4, 'Salud'),
(5, 'Educación'),
(6, 'Telecomunicaciones'),
(7, 'Retail'),
(8, 'Manufactura'),
(9, 'Logística y transporte'),
(10, 'Construcción'),
(11, 'Turismo y hospitalidad'),
(12, 'Energía y recursos Naturales'),
(13, 'Agricultura y alimentación'),
(14, 'Medios de comunicación y entretenimiento'),
(15, 'Otros');

-- Inserción catalogo "examen" se refiere al nombre de la organización a la que pertence el examen:
INSERT INTO examen (id_examen, nombre_examen) VALUES
(1, 'Cisco'),
(2, 'IBM'),
(3, 'Microsoft'),
(4, 'Oracle'),
(5, 'SAP'),
(6, 'CompTIA'),
(7, 'Amazon Web Services'),
(8, 'Google Cloud Platform'),
(9, 'Salesforce'),
(10, 'Red Hat'),
(11, 'VMware'),
(12, 'Palo Alto Networks'),
(13, 'Fortinet'),
(14, 'Juniper Networks'),
(15, 'Otros');

-- Depues de importar la bd de inegi
insert into paises(nombre) values('Otro');

-- Inserts para poblar la tabla motivos_examen_certificacion
INSERT INTO motivo_examen (descripcion) VALUES
('Mejora u oportunidad laboral'),
('Requisito de la empresa o puesto'),
('Incremento salarial'),
('Crecimiento personal'),
('Cambio de carrera o sector laboral'),
('Requisito académico'),
('Mantenerse actualizado'),
('Requisito para obtener otra certificación de nivel superior');

INSERT INTO oauth_clients (client_id, client_secret, redirect_uri, grant_types, scope, user_id)
VALUES ('testclient', 'testpass', NULL, 'client_credentials', 'basic', NULL);

INSERT INTO oauth_scopes (scope, is_default) VALUES ('basic', true);