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

class Empresa extends MY_Controller {

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

    private function subir_logo() {
        if (empty($_FILES['logo']['name'])) {
            return null;
        }

        $config['upload_path']   = './uploads/empresa/';
        $config['allowed_types'] = 'jpg|jpeg|png|webp';
        $config['max_size']      = 2048;
        $config['encrypt_name']  = TRUE;

        if (!is_dir($config['upload_path'])) {
            mkdir($config['upload_path'], 0777, true);
        }

        $this->load->library('upload', $config);

        if (!$this->upload->do_upload('logo')) {
            return array('error' => $this->upload->display_errors('', ''));
        }

        $data = $this->upload->data();
        return array('file_name' => $data['file_name']);
    }

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

        $data['titulo']   = 'Empresa';
        $data['empresas'] = $this->Empresa_model->listar();
        $this->layout('configuracion/empresa/index', $data);
    }

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

        $data['titulo'] = 'Nueva Empresa';
        $this->layout('configuracion/empresa/create', $data);
    }

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

        $this->form_validation->set_rules('nombre',           'Nombre',           'required|trim|max_length[150]');
        $this->form_validation->set_rules('ruc',              'RUC',              'required|trim|max_length[11]');
        $this->form_validation->set_rules('abreviado',        'Abreviado',        'trim|max_length[50]');
        $this->form_validation->set_rules('direccion_fiscal', 'Dirección fiscal', 'trim|max_length[150]');
        $this->form_validation->set_rules('telefono',         'Teléfono',         'trim|max_length[30]');
        $this->form_validation->set_rules('website',          'Website',          'trim|max_length[60]');
        $this->form_validation->set_rules('email',            'Email',            'trim|max_length[60]');
        $this->form_validation->set_rules('ctadetraccion',    'Cta. Detracción',  'trim|max_length[20]');

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

        $ruc = trim($this->input->post('ruc', TRUE));
        if (!ctype_digit($ruc) || strlen($ruc) != 11) {
            $this->session->set_flashdata('error', 'El RUC debe tener 11 dígitos');
            redirect('configuracion/empresa/create');
        }

        if ($this->Empresa_model->existe_ruc($ruc)) {
            $this->session->set_flashdata('error', 'El RUC ya existe');
            redirect('configuracion/empresa/create');
        }

        $logo = $this->subir_logo();
        if (is_array($logo) && isset($logo['error'])) {
            $this->session->set_flashdata('error', $logo['error']);
            redirect('configuracion/empresa/create');
        }

        $data = array(
            'nombre'              => strtoupper(trim($this->input->post('nombre', TRUE))),
            'abreviado'           => strtoupper(trim($this->input->post('abreviado', TRUE))),
            'ruc'                 => $ruc,
            'direccion_fiscal'    => trim($this->input->post('direccion_fiscal', TRUE)),
            'telefono'            => trim($this->input->post('telefono', TRUE)),
            'website'             => trim($this->input->post('website', TRUE)),
            'email'               => trim($this->input->post('email', TRUE)),
            'ctadetraccion'       => trim($this->input->post('ctadetraccion', TRUE)),
            'sol_usuario'         => trim($this->input->post('sol_usuario', TRUE)),
            'sol_clave'           => trim($this->input->post('sol_clave', TRUE)),
            'cert_path'           => trim($this->input->post('cert_path', TRUE)),
            'cert_password'       => trim($this->input->post('cert_password', TRUE)),
            'sunat_modo'          => $this->input->post('sunat_modo') ?: 'beta',
            'comision_porcentaje' => $this->input->post('comision_porcentaje') ?: 0,
            'comision_periodo'    => $this->input->post('comision_periodo') ?: 'MENSUAL',
            'gre_client_id'       => trim($this->input->post('gre_client_id', TRUE)),
            'gre_client_secret'   => trim($this->input->post('gre_client_secret', TRUE)),
            'logo'                => is_array($logo) && isset($logo['file_name']) ? $logo['file_name'] : null,
            'estado'              => 1,
            'created_by'          => $this->session->userdata('id'),
        );

        if ($this->Empresa_model->insertar($data)) {
            $this->session->set_flashdata('success', 'Empresa registrada correctamente');
        } else {
            $this->session->set_flashdata('error', 'No se pudo registrar la empresa');
        }

        redirect('configuracion/empresa');
    }

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

        $empresa = $this->Empresa_model->obtener($id);
        if (!$empresa) show_404();

        $data['titulo']  = 'Editar Empresa';
        $data['empresa'] = $empresa;
        $this->layout('configuracion/empresa/edit', $data);
    }

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

        $empresa = $this->Empresa_model->obtener($id);
        if (!$empresa) show_404();

        $this->form_validation->set_rules('nombre',           'Nombre',           'required|trim|max_length[150]');
        $this->form_validation->set_rules('ruc',              'RUC',              'required|trim|max_length[11]');
        $this->form_validation->set_rules('abreviado',        'Abreviado',        'trim|max_length[50]');
        $this->form_validation->set_rules('direccion_fiscal', 'Dirección fiscal', 'trim|max_length[150]');
        $this->form_validation->set_rules('telefono',         'Teléfono',         'trim|max_length[30]');
        $this->form_validation->set_rules('website',          'Website',          'trim|max_length[60]');
        $this->form_validation->set_rules('email',            'Email',            'trim|max_length[60]');
        $this->form_validation->set_rules('ctadetraccion',    'Cta. Detracción',  'trim|max_length[20]');

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

        $ruc = trim($this->input->post('ruc', TRUE));
        if (!ctype_digit($ruc) || strlen($ruc) != 11) {
            $this->session->set_flashdata('error', 'El RUC debe tener 11 dígitos');
            redirect('configuracion/empresa/edit/' . $id);
        }

        if ($this->Empresa_model->existe_ruc($ruc, $id)) {
            $this->session->set_flashdata('error', 'El RUC ya existe');
            redirect('configuracion/empresa/edit/' . $id);
        }

        $logo = $this->subir_logo();
        if (is_array($logo) && isset($logo['error'])) {
            $this->session->set_flashdata('error', $logo['error']);
            redirect('configuracion/empresa/edit/' . $id);
        }

        $data = array(
            'nombre'              => strtoupper(trim($this->input->post('nombre', TRUE))),
            'abreviado'           => strtoupper(trim($this->input->post('abreviado', TRUE))),
            'ruc'                 => $ruc,
            'direccion_fiscal'    => trim($this->input->post('direccion_fiscal', TRUE)),
            'telefono'            => trim($this->input->post('telefono', TRUE)),
            'website'             => trim($this->input->post('website', TRUE)),
            'email'               => trim($this->input->post('email', TRUE)),
            'ctadetraccion'       => trim($this->input->post('ctadetraccion', TRUE)),
            'sol_usuario'         => trim($this->input->post('sol_usuario', TRUE)),
            'sol_clave'           => trim($this->input->post('sol_clave', TRUE)),
            'cert_path'           => trim($this->input->post('cert_path', TRUE)),
            'cert_password'       => trim($this->input->post('cert_password', TRUE)),
            'sunat_modo'          => $this->input->post('sunat_modo') ?: 'beta',
            'comision_porcentaje' => $this->input->post('comision_porcentaje') ?: 0,
            'comision_periodo'    => $this->input->post('comision_periodo') ?: 'MENSUAL',
            'gre_client_id'       => trim($this->input->post('gre_client_id', TRUE)),
            'gre_client_secret'   => trim($this->input->post('gre_client_secret', TRUE)),
            'updated_at'          => date('Y-m-d H:i:s'),
            'updated_by'          => $this->session->userdata('id'),
        );

        if (is_array($logo) && isset($logo['file_name'])) {
            $data['logo'] = $logo['file_name'];
        }

        if ($this->Empresa_model->actualizar($id, $data)) {
            $this->session->set_flashdata('success', 'Empresa actualizada correctamente');
        } else {
            $this->session->set_flashdata('error', 'No se pudo actualizar la empresa');
        }

        redirect('configuracion/empresa/ver/' . $id);
    }

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

        $empresa = $this->Empresa_model->obtener($id);
        if (!$empresa) show_404();

        $data['titulo']  = 'Detalle de Empresa';
        $data['empresa'] = $empresa;
        $this->layout('configuracion/empresa/ver', $data);
    }

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

        $empresa = $this->Empresa_model->obtener($id);
        if (!$empresa) show_404();

        $nuevoEstado = ($empresa->estado == 1) ? 0 : 1;
        $mensaje     = ($nuevoEstado == 1) ? 'Empresa activada correctamente' : 'Empresa desactivada correctamente';

        if ($this->Empresa_model->cambiarEstado($id, $nuevoEstado, $this->session->userdata('id'))) {
            $this->session->set_flashdata('success', $mensaje);
        } else {
            $this->session->set_flashdata('error', 'No se pudo cambiar el estado');
        }

        redirect('configuracion/empresa');
    }
}
