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

class Conductores extends MY_Controller {

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

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

        $data['titulo'] = 'Conductores';
        $data['conductores'] = $this->Conductor_model->listar();
        $this->layout('mantenimiento/conductores/index', $data);
    }

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

        $data['titulo'] = 'Nuevo Conductor';
        $data['documentos'] = $this->Conductor_model->listar_documentos();
        $this->layout('mantenimiento/conductores/create', $data);
    }

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

        $this->form_validation->set_rules('nro_licencia', 'Nro. Licencia', 'required|trim|max_length[20]');
        $this->form_validation->set_rules('nombre', 'Nombre', 'required|trim|max_length[150]');
        $this->form_validation->set_rules('documento_identidad_id', 'Tipo de documento', 'required');
        $this->form_validation->set_rules('nro_documento', 'Nro. Documento', 'required|trim|max_length[20]');
        $this->form_validation->set_rules('celular', 'Celular', 'trim|max_length[20]');

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

        $nro_licencia   = trim($this->input->post('nro_licencia', TRUE));
        $nombre         = trim($this->input->post('nombre', 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));

        $validacionDocumento = $this->validar_documento_por_tipo($documento_identidad_id, $nro_documento);

        if ($validacionDocumento !== true) {
            $this->session->set_flashdata('error', $validacionDocumento);
            redirect('mantenimiento/conductores/create');
        }

        if ($this->Conductor_model->existe_licencia($nro_licencia)) {
            $this->session->set_flashdata('error', 'El número de licencia ya existe');
            redirect('mantenimiento/conductores/create');
        }

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

        $data = array(
            'nro_licencia'              => $nro_licencia,
            'nombre'                    => $nombre,
            'documento_identidad_id'    => $documento_identidad_id,
            'nro_documento'             => $nro_documento,
            'celular'                   => $celular,
            'estado'                    => 1,
            'created_by'                => $this->session->userdata('id')
        );

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

        redirect('mantenimiento/conductores');
    }

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

        $conductor = $this->Conductor_model->obtener($id);

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

        $data['titulo'] = 'Editar Conductor';
        $data['conductor'] = $conductor;
        $data['documentos'] = $this->Conductor_model->listar_documentos();
        $this->layout('mantenimiento/conductores/edit', $data);
    }

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

        $conductor = $this->Conductor_model->obtener($id);

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

        $this->form_validation->set_rules('nro_licencia', 'Nro. Licencia', 'required|trim|max_length[20]');
        $this->form_validation->set_rules('nombre', 'Nombre', 'required|trim|max_length[150]');
        $this->form_validation->set_rules('documento_identidad_id', 'Tipo de documento', 'required');
        $this->form_validation->set_rules('nro_documento', 'Nro. Documento', 'required|trim|max_length[20]');
        $this->form_validation->set_rules('celular', 'Celular', 'trim|max_length[20]');

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

        $nro_licencia           = trim($this->input->post('nro_licencia', TRUE));
        $nombre                 = trim($this->input->post('nombre', 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));

        $validacionDocumento = $this->validar_documento_por_tipo($documento_identidad_id, $nro_documento);

        if ($validacionDocumento !== true) {
            $this->session->set_flashdata('error', $validacionDocumento);
            redirect('mantenimiento/conductores/edit/' . $id);
        }

        if ($this->Conductor_model->existe_licencia($nro_licencia, $id)) {
            $this->session->set_flashdata('error', 'El número de licencia ya existe');
            redirect('mantenimiento/conductores/edit/' . $id);
        }

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

        $data = array(
            'nro_licencia' => $nro_licencia,
            'nombre' => $nombre,
            'documento_identidad_id' => $documento_identidad_id,
            'nro_documento' => $nro_documento,
            'celular' => $celular,
            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $this->session->userdata('id')
        );

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

        redirect('mantenimiento/conductores');
    }

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

        $conductor = $this->Conductor_model->obtener($id);

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

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

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

        redirect('mantenimiento/conductores');
    }

    private function validar_documento_por_tipo($documento_identidad_id, $nro_documento) {
        $tipoDocumento = $this->Conductor_model->obtener_documento_identidad($documento_identidad_id);

        if (!$tipoDocumento) {
            return 'El tipo de documento seleccionado no es válido';
        }

        $codigo_sunat = trim($tipoDocumento->codigo_sunat);
        $nro_documento = trim($nro_documento);

        if ($codigo_sunat === '1') { // DNI
            if (!ctype_digit($nro_documento) || strlen($nro_documento) != 8) {
                return 'El DNI debe tener exactamente 8 dígitos';
            }
        }

        if ($codigo_sunat === '6') { // RUC
            if (!ctype_digit($nro_documento) || strlen($nro_documento) != 11) {
                return 'El RUC debe tener exactamente 11 dígitos';
            }
        }

        if ($codigo_sunat === '4') { // CE
            if (strlen($nro_documento) < 3 || strlen($nro_documento) > 12) {
                return 'El Carnet de Extranjería debe tener entre 3 y 12 caracteres';
            }
        }

        if ($codigo_sunat === '7') { // PASAPORTE
            if (strlen($nro_documento) < 3 || strlen($nro_documento) > 12) {
                return 'El Pasaporte debe tener entre 3 y 12 caracteres';
            }
        }

        if ($codigo_sunat === '0') { // OTROS
            if (strlen($nro_documento) < 3 || strlen($nro_documento) > 15) {
                return 'El documento debe tener entre 3 y 15 caracteres';
            }
        }

        return true;
    }
}