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

class Tributo extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('mantenimiento/Tributo_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('tributo_ver');

        $data['titulo'] = 'Tributo';
        $this->layout('mantenimiento/tributo/index', $data);
    }

    public function listar() {
        $this->validar_permiso_ajax('tributo_ver');

        $items = $this->Tributo_model->listar();
        $data = array();

        foreach ($items as $item) {
            $estado = $item->estado == 1
                ? '<span class="label label-success">Activo</span>'
                : '<span class="label label-danger">Inactivo</span>';

            $modo = $item->modo == 1 ? 'PORCENTUAL' : 'ESPECIAL';

            $acciones = '';

            if (tiene_permiso('tributo_editar')) {
                $acciones .= '<button type="button" class="btn btn-warning btn-xs btn-editar" data-id="'.$item->id.'">
                                <i class="fa fa-pencil"></i>
                              </button> ';
            }

            if (tiene_permiso('tributo_eliminar')) {
                if ($item->estado == 1) {
                    $acciones .= '<button type="button" class="btn btn-danger btn-xs btn-estado"
                                    data-id="'.$item->id.'"
                                    data-accion="desactivar"
                                    data-nombre="'.$item->nombre.'">
                                    <i class="fa fa-times"></i>
                                  </button>';
                } else {
                    $acciones .= '<button type="button" class="btn btn-success btn-xs btn-estado"
                                    data-id="'.$item->id.'"
                                    data-accion="activar"
                                    data-nombre="'.$item->nombre.'">
                                    <i class="fa fa-check"></i>
                                  </button>';
                }
            }

            $data[] = array(
                $item->id,
                !empty($item->codigo) ? $item->codigo : '-',
                $item->nombre,
                number_format((float)$item->valor_porcentual, 4, '.', ''),
                number_format((float)$item->valor_fijo, 4, '.', ''),
                $item->abreviado,
                $modo,
                $estado,
                $acciones
            );
        }

        echo json_encode(array('data' => $data));
    }

    public function guardar() {
        $this->validar_permiso_ajax('tributo_crear');

        $codigo = strtoupper(trim($this->input->post('codigo', TRUE)));
        $nombre = strtoupper(trim($this->input->post('nombre', TRUE)));
        $valor_porcentual = $this->input->post('valor_porcentual', TRUE);
        $valor_fijo = $this->input->post('valor_fijo', TRUE);
        $abreviado = strtoupper(trim($this->input->post('abreviado', TRUE)));
        $modo = $this->input->post('modo', TRUE);

        if ($nombre === '' || $abreviado === '') {
            echo json_encode(array(
                'status' => false,
                'message' => 'Nombre y abreviado son obligatorios'
            ));
            return;
        }

        if (strlen($codigo) > 10) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El código no debe exceder 10 caracteres'
            ));
            return;
        }

        if (strlen($abreviado) > 20) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El abreviado no debe exceder 20 caracteres'
            ));
            return;
        }

        if ($valor_porcentual === '' || !is_numeric($valor_porcentual)) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El valor porcentual debe ser numérico'
            ));
            return;
        }

        if ($valor_fijo === '' || !is_numeric($valor_fijo)) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El valor fijo debe ser numérico'
            ));
            return;
        }

        if (!in_array((string)$modo, array('0', '1'), true)) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El modo no es válido'
            ));
            return;
        }

        $codigo = $codigo !== '' ? $codigo : null;

        if ($this->Tributo_model->existe_codigo($codigo)) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El código ya existe'
            ));
            return;
        }

        if ($this->Tributo_model->existe_nombre($nombre)) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El nombre ya existe'
            ));
            return;
        }

        if ($this->Tributo_model->existe_abreviado($abreviado)) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El abreviado ya existe'
            ));
            return;
        }

        $data = array(
            'codigo' => $codigo,
            'nombre' => $nombre,
            'valor_porcentual' => $valor_porcentual,
            'valor_fijo' => $valor_fijo,
            'abreviado' => $abreviado,
            'modo' => (int)$modo,
            'estado' => 1,
            'created_by' => $this->session->userdata('id')
        );

        $ok = $this->Tributo_model->insertar($data);

        echo json_encode(array(
            'status' => $ok ? true : false,
            'message' => $ok ? 'Tributo registrado correctamente' : 'No se pudo registrar el tributo'
        ));
    }

    public function obtener($id) {
        $this->validar_permiso_ajax('tributo_editar');

        $item = $this->Tributo_model->obtener($id);

        if (!$item) {
            echo json_encode(array(
                'status' => false,
                'message' => 'Registro no encontrado'
            ));
            return;
        }

        echo json_encode(array(
            'status' => true,
            'data' => $item
        ));
    }

    public function actualizar($id) {
        $this->validar_permiso_ajax('tributo_editar');

        $item = $this->Tributo_model->obtener($id);

        if (!$item) {
            echo json_encode(array(
                'status' => false,
                'message' => 'Registro no encontrado'
            ));
            return;
        }

        $codigo = strtoupper(trim($this->input->post('codigo', TRUE)));
        $nombre = strtoupper(trim($this->input->post('nombre', TRUE)));
        $valor_porcentual = $this->input->post('valor_porcentual', TRUE);
        $valor_fijo = $this->input->post('valor_fijo', TRUE);
        $abreviado = strtoupper(trim($this->input->post('abreviado', TRUE)));
        $modo = $this->input->post('modo', TRUE);

        if ($nombre === '' || $abreviado === '') {
            echo json_encode(array(
                'status' => false,
                'message' => 'Nombre y abreviado son obligatorios'
            ));
            return;
        }

        if (strlen($codigo) > 10) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El código no debe exceder 10 caracteres'
            ));
            return;
        }

        if (strlen($abreviado) > 20) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El abreviado no debe exceder 20 caracteres'
            ));
            return;
        }

        if ($valor_porcentual === '' || !is_numeric($valor_porcentual)) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El valor porcentual debe ser numérico'
            ));
            return;
        }

        if ($valor_fijo === '' || !is_numeric($valor_fijo)) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El valor fijo debe ser numérico'
            ));
            return;
        }

        if (!in_array((string)$modo, array('0', '1'), true)) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El modo no es válido'
            ));
            return;
        }

        $codigo = $codigo !== '' ? $codigo : null;

        if ($this->Tributo_model->existe_codigo($codigo, $id)) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El código ya existe'
            ));
            return;
        }

        if ($this->Tributo_model->existe_nombre($nombre, $id)) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El nombre ya existe'
            ));
            return;
        }

        if ($this->Tributo_model->existe_abreviado($abreviado, $id)) {
            echo json_encode(array(
                'status' => false,
                'message' => 'El abreviado ya existe'
            ));
            return;
        }

        $data = array(
            'codigo' => $codigo,
            'nombre' => $nombre,
            'valor_porcentual' => $valor_porcentual,
            'valor_fijo' => $valor_fijo,
            'abreviado' => $abreviado,
            'modo' => (int)$modo,
            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $this->session->userdata('id')
        );

        $ok = $this->Tributo_model->actualizar($id, $data);

        echo json_encode(array(
            'status' => $ok ? true : false,
            'message' => $ok ? 'Tributo actualizado correctamente' : 'No se pudo actualizar el tributo'
        ));
    }

    public function estado($id) {
        $this->validar_permiso_ajax('tributo_eliminar');

        $item = $this->Tributo_model->obtener($id);

        if (!$item) {
            echo json_encode(array(
                'status' => false,
                'message' => 'Registro no encontrado'
            ));
            return;
        }

        $nuevoEstado = $item->estado == 1 ? 0 : 1;

        $ok = $this->Tributo_model->cambiarEstado($id, $nuevoEstado, $this->session->userdata('id'));

        echo json_encode(array(
            'status' => $ok ? true : false,
            'message' => $ok
                ? ($nuevoEstado == 1 ? 'Tributo activado correctamente' : 'Tributo desactivado correctamente')
                : 'No se pudo cambiar el estado'
        ));
    }
}