const Sequelize = require('sequelize');
var db = require("../database/db.js");
const Usuario_Rol = require('./usuario_rol.js');
const Capacitacion = require('./capacitacion.js');
const Estudio = require('./estudio.js');
const Permiso = require('./permiso.js');
const Carga_Familiar = require('./carga_familiar.js');
const Historial_Empresa = require('./historial_empresa.js');
const Licencia = require('./licencia.js');
const Experiencia_Laboral = require('./experiencia_laboral');
const Asistencia = require('./asistencia');
const Idioma = require('./idioma.js');
const LiberacionHSE = require('./liberacionHSE');
const VacunaUsuario = require('./vacunaUsuario.js');
const EvaluacionDesempeno = require('./evaluacion_desempeno');
const RegistroAlimentacion = require('./registroAlimentacion.js');
const Local = require('./local.js');
const Horario = require('./horario');
const TramoHorario = require('./tramo_horario');
const UsuarioHorario = require('./usuario_horario');
const Usuario = db.sequelize.define('USUARIO', {

    //INFORMACIÓN PERSONAL
    ID_USUARIO: {
        primaryKey: true,
        type: Sequelize.BIGINT,
        allowNull: false,
        autoIncrement: true
    },


    USUARIO: {
        type: Sequelize.STRING,
        allowNull: false,
    },
    CONTRASENIA: {
        type: Sequelize.STRING,
        allowNull: false,
    },

    FOTO: {
        type: Sequelize.STRING,
        allowNull: true,
    },




    NOMBRES: {
        type: Sequelize.STRING,
        allowNull: false,
    },

    APELLIDOS: {
        type: Sequelize.STRING,
        allowNull: false,
    },

    IDENTIFICACION: {
        type: Sequelize.STRING,
        allowNull: false,
    },

    CORREO: {
        type: Sequelize.STRING,
        allowNull: false,
    },

    CORREO_EMPRESARIAL: {
        type: Sequelize.STRING,
        allowNull: true  // Es opcional
    },

    OBSERVACION: {
        type: Sequelize.STRING,
        allowNull: true,
    },



    NACIONALIDAD: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    FECHA_NACIMIENTO: {
        type: Sequelize.DATEONLY,
        allowNull: true,
    },
    ACERCA_DE_TI: {
        type: Sequelize.STRING,
        allowNull: true,
    },


    ////////// INFORMACIÓN ADICIONAL

    ESTADO_CIVIL: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    TIPO_SANGRE: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    SEXO: {
        type: Sequelize.STRING,
        allowNull: true,
    },


    ///DIRECCION DE DOMICILIO 
    DIRECCION: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    ID_CANTON: {
        type: Sequelize.INTEGER,
        allowNull: true,
    },

    CODIGO_POSTAL: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    TELEFONO_DOMICILIO: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    CELULAR: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    EDAD: {
        type: Sequelize.INTEGER,
        allowNull: true,
    },

    ///CONTACTO EMERGENCIA
    CONTACTO: {
        type: Sequelize.STRING,
        allowNull: true,
    },


    TELEFONO_CONTACTO: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    CELULAR_CONTACTO: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    FECHA_REGISTRO: {
        type: Sequelize.STRING,
        allowNull: false,
    },

    ARCHIVO_CI: {
        type: Sequelize.STRING,
        allowNull: true,
    },



    ESTADO: {
        type: Sequelize.INTEGER,
        allowNull: false,
    },

    // hse

    MANEJO_DEFENSIVO: {
        type: Sequelize.BOOLEAN,
        allowNull: true,
    },
    MANEJO_DEFENSIVO_EVIDENCIA: {
        type: Sequelize.STRING,
        allowNull: true
    },
    CERTIFICADO_MANEJO_EMPRESA: {
        type: Sequelize.BOOLEAN,
        allowNull: true,
    },
    CERTIFICADO_MANEJO_EVIDENCIA: {
        type: Sequelize.STRING,
        allowNull: true
    },
    CONVIVE_PAREJA: {
        type: Sequelize.BOOLEAN,
        allowNull: true,
        defaultValue: false,
    },

    CARGAS_FAMILIARES_RDEP: {
        type: Sequelize.INTEGER,
        allowNull: true,
    },

    CARGAS_HIJOS: {
        type: Sequelize.INTEGER,
        allowNull: true,
    },
    BANCO: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    TIPO_CUENTA: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    NUMERO_CUENTA: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    // Lugar de nacimiento y residencia
    LUGAR_NACIMIENTO: {
        type: Sequelize.STRING,
        allowNull: true,
    },
    LUGAR_RESIDENCIA: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    // Parentesco contacto emergencia
    PARENTESCO: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    // Identificación étnica
    IDENTIFICACION_ETNICA: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    ENCUENTRA_EMPLEO: {
        type: Sequelize.STRING,
        allowNull: true,
    },

    DIAS_VACACIONES: {
        type: Sequelize.INTEGER,
        allowNull: true,
        defaultValue: 0,
    }
},
    {
        timestamps: false,
        id: false
    })




Usuario.hasMany(Usuario_Rol, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'USUARIO_ROL' });
Usuario_Rol.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO' });

Usuario.hasMany(Capacitacion, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'CAPACITACION' });
Capacitacion.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO' });

Usuario.hasMany(Estudio, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'ESTUDIO' });
Estudio.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO' });

Usuario.hasMany(Permiso, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'PERMISO' });
Permiso.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO' });

Usuario.hasMany(Carga_Familiar, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'CARGA_FAMILIAR' });
Carga_Familiar.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO' });

Usuario.hasMany(Historial_Empresa, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'HISTORIAL_EMPRESA' });
Historial_Empresa.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'USUARIO' });

Usuario.hasMany(Licencia, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'LICENCIA' });
Licencia.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO' });

Usuario.hasMany(Experiencia_Laboral, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'EXPERIENCIA_LABORAL' });
Experiencia_Laboral.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO' });

Usuario.hasMany(Asistencia, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'ASISTENCIA' });
Asistencia.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'USUARIO' });

// Relación de Asistencia con Horario
Asistencia.belongsTo(Horario, { foreignKey: 'ID_HORARIO', as: 'HORARIO' });

Usuario.hasMany(Idioma, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'IDIOMA' });
Idioma.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO' });

Usuario.hasMany(LiberacionHSE, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'LIBERACIONES_HSE' });
LiberacionHSE.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO' });

const UsuarioCertificacionHabilitante = require('./usuarioCertificacionHabilitante');
const TipoCertificacionHabilitante = require('./tipoCertificacionHabilitante');
Usuario.hasMany(UsuarioCertificacionHabilitante, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'CERTIFICACIONES_HABILITANTES' });
UsuarioCertificacionHabilitante.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO' });
UsuarioCertificacionHabilitante.belongsTo(TipoCertificacionHabilitante, { foreignKey: 'ID_TIPO_CERTIFICACION', sourceKey: 'ID_TIPO_CERTIFICACION' });
TipoCertificacionHabilitante.hasMany(UsuarioCertificacionHabilitante, { foreignKey: 'ID_TIPO_CERTIFICACION', sourceKey: 'ID_TIPO_CERTIFICACION' });

Usuario.hasMany(VacunaUsuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'VACUNAS' });
VacunaUsuario.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO' });

Usuario.hasMany(EvaluacionDesempeno, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO',  as: 'EVALUACIONES' });
EvaluacionDesempeno.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO' });

Usuario.hasMany(RegistroAlimentacion, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'REGISTROS_ALIMENTACION' });
RegistroAlimentacion.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO' });

// Asociación entre RegistroAlimentacion y Local
Local.hasMany(RegistroAlimentacion, { foreignKey: 'ID_LOCAL', sourceKey: 'ID_LOCAL', as: 'REGISTROS_ALIMENTACION' });
RegistroAlimentacion.belongsTo(Local, { foreignKey: 'ID_LOCAL', sourceKey: 'ID_LOCAL' });

// Asociaciones de Horario
Horario.hasMany(TramoHorario, { foreignKey: 'ID_HORARIO', sourceKey: 'ID_HORARIO', as: 'TRAMOS' });
TramoHorario.belongsTo(Horario, { foreignKey: 'ID_HORARIO', sourceKey: 'ID_HORARIO' });

UsuarioHorario.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'USUARIO' });
UsuarioHorario.belongsTo(Horario, { foreignKey: 'ID_HORARIO', sourceKey: 'ID_HORARIO', as: 'HORARIO' });

// ─── Matrices RRHH ────────────────────────────────────────────────────────────

const AusentismoRegistro = require('./ausentismo_registro');
Usuario.hasMany(AusentismoRegistro, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'AUSENTISMOS' });
AusentismoRegistro.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'USUARIO' });

const VacacionesSaldo = require('./vacaciones_saldo');
Usuario.hasMany(VacacionesSaldo, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'VACACIONES_SALDOS' });
VacacionesSaldo.belongsTo(Usuario, { foreignKey: 'ID_USUARIO', sourceKey: 'ID_USUARIO', as: 'USUARIO' });

// ─────────────────────────────────────────────────────────────────────────────

module.exports = Usuario;