<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Empleados extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('rrhh/Empleado_model');
    }

    protected function validar_permiso_ajax($slug) {
        if (!tiene_permiso($slug)) {
            echo json_encode(array(
                'status' => false,
                'message' => 'No tienes permisos para esta acción'
            ));
            exit;
        }
    }

    public function index() {
        $this->validar_permiso('empleados_ver');

        $data['titulo'] = 'Empleados';
        $data['empleados'] = $this->Empleado_model->listar();
        $this->layout('rrhh/empleados/index', $data);
    }

    public function ver($id) {
        $this->validar_permiso('empleados_ver');

        $empleado = $this->db
            ->select('
                e.*,
                a.nombre as area,
                d.nombre as tipo_documento,
                d.abreviado as documento_abreviado,
                c.nombre as cargo,
                r.nombre as regimen_pension,
                u.nombre as distrito_nombre,
                u.departamento as ub_departamento,
                u.provincia as ub_provincia,
                u.distrito as ub_distrito
            ')
            ->from('rh_empleado e')
            ->join('mt_area a', 'a.id = e.area_id')
            ->join('mt_documento_identidad d', 'd.id = e.documento_identidad_id')
            ->join('mt_cargo c', 'c.id = e.cargo_id')
            ->join('mt_regimen_pension r', 'r.id = e.regimen_pension_id')
            ->join('mt_ubigeo u', 'u.id = e.ubigeo_id', 'left')
            ->where('e.id', $id)
            ->get()
            ->row();

        if (!$empleado) {
            show_404();
        }

        $departamento = null;
        $provincia = null;

        if (!empty($empleado->ub_departamento)) {
            $departamento = $this->Empleado_model->get_departamento_nombre($empleado->ub_departamento);
        }

        if (!empty($empleado->ub_departamento) && !empty($empleado->ub_provincia)) {
            $provincia = $this->Empleado_model->get_provincia_nombre(
                $empleado->ub_departamento,
                $empleado->ub_provincia
            );
        }

        $empleado->departamento_nombre = $departamento ? $departamento->nombre : '';
        $empleado->provincia_nombre = $provincia ? $provincia->nombre : '';
        $empleado->distrito_nombre = !empty($empleado->distrito_nombre) ? $empleado->distrito_nombre : '';

        $data['titulo'] = 'Detalle de Empleado';
        $data['empleado'] = $empleado;

        $this->layout('rrhh/empleados/ver', $data);
    }
    


    public function create() {
        $this->validar_permiso('empleados_crear');

        $data['titulo'] = 'Nuevo Empleado';
        $data['areas'] = $this->Empleado_model->listar_areas();
        $data['documentos'] = $this->Empleado_model->listar_documentos();
        $data['cargos'] = $this->Empleado_model->listar_cargos();
        $data['regimenes'] = $this->Empleado_model->listar_regimenes();
        $data['departamentos'] = $this->Empleado_model->get_departamentos();

        $this->layout('rrhh/empleados/create', $data);
    }

    public function store() {
        $this->validar_permiso('empleados_crear');

        $this->form_validation->set_rules('area_id', 'Área', 'required');
        $this->form_validation->set_rules('apellidos', 'Apellidos', 'required|trim');
        $this->form_validation->set_rules('nombres', 'Nombres', 'required|trim');
        $this->form_validation->set_rules('documento_identidad_id', 'Tipo de documento', 'required');
        $this->form_validation->set_rules('nro_documento', 'Número de documento', 'required|trim');
        $this->form_validation->set_rules('sexo', 'Sexo', 'required');
        $this->form_validation->set_rules('fecha_nacimiento', 'Fecha de nacimiento', 'required');
        $this->form_validation->set_rules('fecha_ingreso', 'Fecha de ingreso', 'required');
        $this->form_validation->set_rules('cargo_id', 'Cargo', 'required');
        $this->form_validation->set_rules('regimen_pension_id', 'Régimen de pensión', 'required');
        $this->form_validation->set_rules('sueldo_basico', 'Sueldo básico', 'required');

        if ($this->form_validation->run() == FALSE) {
            $this->create();
            return;
        }

        $fecha_nacimiento       = $this->input->post('fecha_nacimiento', TRUE);
        $fecha_ingreso          = $this->input->post('fecha_ingreso', TRUE);
        $documento_identidad_id = $this->input->post('documento_identidad_id', TRUE);
        $nro_documento          = trim($this->input->post('nro_documento', TRUE));
        $celular                = trim($this->input->post('celular', TRUE));
        $sueldo_basico          = $this->input->post('sueldo_basico', TRUE);
        $comision_cuota          = $this->input->post('comision_cuota', TRUE);

        $validacion_fechas = $this->validar_fechas($fecha_nacimiento, $fecha_ingreso);
        if ($validacion_fechas !== true) {
            $this->session->set_flashdata('error', $validacion_fechas);
            redirect('rrhh/empleados/create');
        }

        $validacion_documento = $this->validar_documento_por_tipo($documento_identidad_id, $nro_documento);
        if ($validacion_documento !== true) {
            $this->session->set_flashdata('error', $validacion_documento);
            redirect('rrhh/empleados/create');
        }

        $validacion_celular = $this->validar_celular($celular);
        if ($validacion_celular !== true) {
            $this->session->set_flashdata('error', $validacion_celular);
            redirect('rrhh/empleados/create');
        }

        if ((float)$sueldo_basico < 0) {
            $this->session->set_flashdata('error', 'El sueldo básico no puede ser negativo');
            redirect('rrhh/empleados/create');
        }

        if ((float)$comision_cuota < 0) {
            $this->session->set_flashdata('error', 'La Cuota de la comisión no puede ser negativo');
            redirect('rrhh/empleados/create');
        }

        $email = trim($this->input->post('email', TRUE));
        if ($email !== '' && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $this->session->set_flashdata('error', 'El correo electrónico no tiene un formato válido');
            redirect('rrhh/empleados/create');
        }

        $nro_documento = trim($this->input->post('nro_documento', TRUE));

        if ($this->Empleado_model->existe_documento($nro_documento)) {
            $this->session->set_flashdata('error', 'El número de documento ya existe');
            redirect('rrhh/empleados/create');
        }

        $data = array(
            'area_id'       => $this->input->post('area_id', TRUE),
            'apellidos'     => $this->normalizarTexto($this->input->post('apellidos', TRUE)),
            'nombres'       => $this->normalizarTexto($this->input->post('nombres', TRUE)),
            'documento_identidad_id' => $this->input->post('documento_identidad_id', TRUE),
            'nro_documento' => $nro_documento,
            'sexo'          => $this->input->post('sexo', TRUE),
            'fecha_nacimiento' => $this->input->post('fecha_nacimiento', TRUE),
            'fecha_ingreso' => $this->input->post('fecha_ingreso', TRUE),
            'direccion'     => trim($this->input->post('direccion', TRUE)),
            'ubigeo_id'     => $this->input->post('ubigeo_id', TRUE) ? $this->input->post('ubigeo_id', TRUE) : null,
            'celular'       => trim($this->input->post('celular', TRUE)),
            'email'         => trim($this->input->post('email', TRUE)),
            'sueldo_basico' => $this->input->post('sueldo_basico', TRUE),
            'comision_cuota' => $this->input->post('comision_cuota', TRUE),
            'cargo_id'      => $this->input->post('cargo_id', TRUE),
            'regimen_pension_id' => $this->input->post('regimen_pension_id', TRUE),
            'estado'        => 1,
            'created_by'    => $this->session->userdata('id')
        );

        if ($this->Empleado_model->insertar($data)) {
            $this->session->set_flashdata('success', 'Empleado registrado correctamente');
        } else {
            $this->session->set_flashdata('error', 'No se pudo registrar el empleado');
        }

        redirect('rrhh/empleados');
    }

    public function edit($id) {
        $this->validar_permiso('empleados_editar');

        $empleado = $this->Empleado_model->obtener($id);

        if (!$empleado) {
            show_404();
        }

        $ubigeo = null;
        if (!empty($empleado->ubigeo_id)) {
            $ubigeo = $this->Empleado_model->get_ubigeo_by_id($empleado->ubigeo_id);
        }

        $data['titulo'] = 'Editar Empleado';
        $data['empleado'] = $empleado;
        $data['areas'] = $this->Empleado_model->listar_areas();
        $data['documentos'] = $this->Empleado_model->listar_documentos();
        $data['cargos'] = $this->Empleado_model->listar_cargos();
        $data['regimenes'] = $this->Empleado_model->listar_regimenes();
        $data['departamentos'] = $this->Empleado_model->get_departamentos();
        $data['ubigeo_actual'] = $ubigeo;

        if ($ubigeo) {
            $data['provincias'] = $this->Empleado_model->get_provincias($ubigeo->departamento);
            $data['distritos'] = $this->Empleado_model->get_distritos($ubigeo->departamento, $ubigeo->provincia);
        } else {
            $data['provincias'] = array();
            $data['distritos'] = array();
        }

        $this->layout('rrhh/empleados/edit', $data);
    }

    public function update($id) {
        $this->validar_permiso('empleados_editar');

        $empleado = $this->Empleado_model->obtener($id);

        if (!$empleado) {
            show_404();
        }

        $this->form_validation->set_rules('area_id', 'Área', 'required');
        $this->form_validation->set_rules('apellidos', 'Apellidos', 'required|trim');
        $this->form_validation->set_rules('nombres', 'Nombres', 'required|trim');
        $this->form_validation->set_rules('documento_identidad_id', 'Tipo de documento', 'required');
        $this->form_validation->set_rules('nro_documento', 'Número de documento', 'required|trim');
        $this->form_validation->set_rules('sexo', 'Sexo', 'required');
        $this->form_validation->set_rules('fecha_nacimiento', 'Fecha de nacimiento', 'required');
        $this->form_validation->set_rules('fecha_ingreso', 'Fecha de ingreso', 'required');
        $this->form_validation->set_rules('cargo_id', 'Cargo', 'required');
        $this->form_validation->set_rules('regimen_pension_id', 'Régimen de pensión', 'required');
        $this->form_validation->set_rules('sueldo_basico', 'Sueldo básico', 'required');

        if ($this->form_validation->run() == FALSE) {
            $this->edit($id);
            return;
        }

        $fecha_nacimiento = $this->input->post('fecha_nacimiento', TRUE);
        $fecha_ingreso = $this->input->post('fecha_ingreso', TRUE);
        $documento_identidad_id = $this->input->post('documento_identidad_id', TRUE);
        $nro_documento = trim($this->input->post('nro_documento', TRUE));
        $celular = trim($this->input->post('celular', TRUE));
        $sueldo_basico = $this->input->post('sueldo_basico', TRUE);
        $comision_cuota = $this->input->post('comision_cuota', TRUE);

        $validacion_fechas = $this->validar_fechas($fecha_nacimiento, $fecha_ingreso);
        if ($validacion_fechas !== true) {
            $this->session->set_flashdata('error', $validacion_fechas);
            redirect('rrhh/empleados/edit/'.$id);
        }

        $validacion_documento = $this->validar_documento_por_tipo($documento_identidad_id, $nro_documento);
        if ($validacion_documento !== true) {
            $this->session->set_flashdata('error', $validacion_documento);
            redirect('rrhh/empleados/edit/'.$id);
        }

        $validacion_celular = $this->validar_celular($celular);
        if ($validacion_celular !== true) {
            $this->session->set_flashdata('error', $validacion_celular);
            redirect('rrhh/empleados/edit/'.$id);
        }

        if ((float)$sueldo_basico < 0) {
            $this->session->set_flashdata('error', 'El sueldo básico no puede ser negativo');
            redirect('rrhh/empleados/edit/'.$id);
        }

        if ((float)$comision_cuota < 0) {
            $this->session->set_flashdata('error', 'La cuota de la comisión no puede ser negativo');
            redirect('rrhh/empleados/edit/'.$id);
        }

        $nro_documento = trim($this->input->post('nro_documento', TRUE));

        if ($this->Empleado_model->existe_documento($nro_documento, $id)) {
            $this->session->set_flashdata('error', 'El número de documento ya existe');
            redirect('rrhh/empleados/edit/'.$id);
        }

        $email = trim($this->input->post('email', TRUE));
        if ($email !== '' && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $this->session->set_flashdata('error', 'El correo electrónico no tiene un formato válido');
            redirect('rrhh/empleados/edit');
        }
        $data = array(
            'area_id'           => $this->input->post('area_id', TRUE),
            'apellidos'         => $this->normalizarTexto($this->input->post('apellidos', TRUE)),
            'nombres'           => $this->normalizarTexto($this->input->post('nombres', TRUE)),
            'documento_identidad_id' => $this->input->post('documento_identidad_id', TRUE),
            'nro_documento'     => $nro_documento,
            'sexo'              => $this->input->post('sexo', TRUE),
            'fecha_nacimiento'  => $this->input->post('fecha_nacimiento', TRUE),
            'fecha_ingreso'     => $this->input->post('fecha_ingreso', TRUE),
            'direccion'         => trim($this->input->post('direccion', TRUE)),
            'ubigeo_id'         => $this->input->post('ubigeo_id', TRUE) ? $this->input->post('ubigeo_id', TRUE) : null,
            'celular'           => trim($this->input->post('celular', TRUE)),
            'email'             => trim($this->input->post('email', TRUE)),
            'sueldo_basico'     => $this->input->post('sueldo_basico', TRUE),
            'comision_cuota'     => $this->input->post('comision_cuota', TRUE),
            'cargo_id'          => $this->input->post('cargo_id', TRUE),
            'regimen_pension_id' => $this->input->post('regimen_pension_id', TRUE),
            'updated_at'        => date('Y-m-d H:i:s'),
            'updated_by'        => $this->session->userdata('id')
        );

        if ($this->Empleado_model->actualizar($id, $data)) {
            $this->session->set_flashdata('success', 'Empleado actualizado correctamente');
        } else {
            $this->session->set_flashdata('error', 'No se pudo actualizar el empleado');
        }

        redirect('rrhh/empleados');
    }

    public function estado($id) {
        $this->validar_permiso('empleados_eliminar');

        $empleado = $this->Empleado_model->obtener($id);

        if (!$empleado) {
            show_404();
        }

        $nuevoEstado = ($empleado->estado == 1) ? 0 : 1;

        if ($this->Empleado_model->cambiarEstado($id, $nuevoEstado, $this->session->userdata('id'))) {
            $mensaje = ($nuevoEstado == 1) ? 'Empleado activado correctamente' : 'Empleado desactivado correctamente';
            $this->session->set_flashdata('success', $mensaje);
        } else {
            $this->session->set_flashdata('error', 'No se pudo cambiar el estado del empleado');
        }

        redirect('rrhh/empleados');
    }

    public function provincias_ajax() {
        $this->validar_permiso_ajax('empleados_crear');

        $departamento = $this->input->post('departamento', TRUE);
        $provincias = $this->Empleado_model->get_provincias($departamento);

        echo json_encode($provincias);
    }

    public function distritos_ajax() {
        $this->validar_permiso_ajax('empleados_crear');

        $departamento = $this->input->post('departamento', TRUE);
        $provincia = $this->input->post('provincia', TRUE);
        $distritos = $this->Empleado_model->get_distritos($departamento, $provincia);

        echo json_encode($distritos);
    }


    private function normalizarTexto($texto) {
        return strtoupper(trim($texto));
    }

    private function validar_fechas($fecha_nacimiento, $fecha_ingreso) {
        if (strtotime($fecha_nacimiento) > strtotime(date('Y-m-d'))) {
            return 'La fecha de nacimiento no puede ser mayor a hoy';
        }

        if (strtotime($fecha_ingreso) > strtotime(date('Y-m-d'))) {
            return 'La fecha de ingreso no puede ser mayor a hoy';
        }

        if (strtotime($fecha_ingreso) <= strtotime($fecha_nacimiento)) {
            return 'La fecha de ingreso debe ser mayor a la fecha de nacimiento';
        }

        $edad = date('Y') - date('Y', strtotime($fecha_nacimiento));
        if ($edad < 18) {
            return 'El empleado debe ser mayor de edad';
        }

        return true;
    }

    private function validar_documento_por_tipo($documento_identidad_id, $nro_documento) {
        $doc = $this->db->where('id', $documento_identidad_id)->get('mt_documento_identidad')->row();

        if (!$doc) {
            return 'Tipo de documento no válido';
        }

        $abreviado = strtoupper(trim($doc->abreviado));
        $nro = trim($nro_documento);

        if (in_array($abreviado, array('DNI', 'RUC'))) {
            if (!ctype_digit($nro)) {
                return 'El número de documento debe contener solo números';
            }
        }

        if ($abreviado === 'DNI' && strlen($nro) != 8) {
            return 'El DNI debe tener exactamente 8 dígitos';
        }

        if ($abreviado === 'RUC' && strlen($nro) != 11) {
            return 'El RUC debe tener exactamente 11 dígitos';
        }

        return true;
    }

    private function validar_celular($celular) {
        $celular = trim($celular);

        if ($celular === '') {
            return true;
        }

        if (!ctype_digit($celular)) {
            return 'El celular debe contener solo números';
        }

        if (strlen($celular) != 9) {
            return 'El celular debe tener 9 dígitos';
        }

        return true;
    }
}