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

class Productos extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('mantenimiento/Almacen_model');
        $this->load->model('ventas/Producto_almacen_model');
        $this->load->model('ventas/Producto_model');
    }

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

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

        $config['upload_path'] = './uploads/productos/';
        $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('imagen')) {
            return array('error' => $this->upload->display_errors('', ''));
        }

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

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

        $data['titulo'] = 'Productos';
        $data['productos'] = $this->Producto_model->listar();
        $this->layout('ventas/productos/index', $data);
    }

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

        $data['titulo'] = 'Nuevo Producto';
        $data['almacenes'] = $this->Almacen_model->listar_activos();
        $data['categorias'] = $this->Producto_model->listar_categorias();
        $data['monedas'] = $this->Producto_model->listar_monedas();
        $data['unidades'] = $this->Producto_model->listar_unidades();
        $data['tafigv'] = $this->Producto_model->listar_tafigv();
        $data['detracciones'] = $this->Producto_model->listar_detracciones();

        $this->layout('ventas/productos/create', $data);
    }

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

        $this->form_validation->set_rules('categoria_id', 'Categoría', 'required');
        $this->form_validation->set_rules('codigo', 'Código', 'required|trim|max_length[30]');
        $this->form_validation->set_rules('nombre', 'Nombre', 'required|trim|max_length[200]');
        $this->form_validation->set_rules('bien_serv', 'Tipo', 'required');
        $this->form_validation->set_rules('tafigv_id', 'Afectación IGV', 'required');
        $this->form_validation->set_rules('almacen_id', 'Almacen', 'required');

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

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

        if ($this->Producto_model->existe_codigo($codigo)) {
            $this->session->set_flashdata('error', 'El código del producto ya existe');
            redirect('ventas/productos/create');
        }

        $imagen = $this->subir_imagen();
        if (is_array($imagen) && isset($imagen['error'])) {
            $this->session->set_flashdata('error', $imagen['error']);
            redirect('ventas/productos/create');
        }

        $data = array(
            'categoria_id'          => $this->input->post('categoria_id', TRUE),
            'codigo'                => $codigo,
            'nombre'                => $this->normalizarTexto($this->input->post('nombre', TRUE)),
            'descripcion'           => trim($this->input->post('descripcion', TRUE)),

            'moneda_id_compra'      => $this->input->post('moneda_id_compra', TRUE) ?: null,
            'precio_compra'         => $this->input->post('precio_compra', TRUE) ?: 0,
            'um_id_compra'          => $this->input->post('um_id_compra', TRUE) ?: null,

            'moneda_id_venta'       => $this->input->post('moneda_id_venta', TRUE) ?: null,
            'precio_unidad'         => $this->input->post('precio_unidad', TRUE) ?: 0,
            'precio_doce'           => $this->input->post('precio_doce', TRUE) ?: 0,
            'precio_veinticinco'    => $this->input->post('precio_veinticinco', TRUE) ?: 0,
            'precio_cincuenta'      => $this->input->post('precio_cincuenta', TRUE) ?: 0,
            'precio_cien'           => $this->input->post('precio_cien', TRUE) ?: 0,
            'precio_millar'         => $this->input->post('precio_millar', TRUE) ?: 0,
            'um_id_venta'           => $this->input->post('um_id_venta', TRUE) ?: null,

            'bien_serv' => $this->input->post('bien_serv', TRUE),
            'maneja_stock' => $this->input->post('maneja_stock', TRUE) ? 1 : 0,
            'activo_compra' => $this->input->post('activo_compra', TRUE) ? 1 : 0,
            'activo_venta' => $this->input->post('activo_venta', TRUE) ? 1 : 0,

            'tafigv_id' => $this->input->post('tafigv_id', TRUE),
            'detraccion_id' => $this->input->post('detraccion_id', TRUE) ?: null,
            'imagen' => is_array($imagen) && isset($imagen['file_name']) ? $imagen['file_name'] : null,

            'estado' => 1,
            'created_by' => $this->session->userdata('id')
        );

        $producto_id = $this->Producto_model->insertar($data);

        if ($producto_id) {
            $almacen_id = $this->input->post('almacen_id', TRUE);

            if (!$this->Producto_almacen_model->existe($producto_id, $almacen_id)) {
                $this->Producto_almacen_model->insertar(array(
                    'producto_id' => $producto_id,
                    'almacen_id' => $almacen_id,
                    'cantidad_stock' => 0.00,
                    'cantidad_reposicion' => 0.00,
                    'cantidad_comprometida' => 0.00,
                    'cantidad_minima' => 0.00,
                    'cantidad_maxima' => 0.00,
                    'precio_promedio' => 0.0000,
                    'created_by' => $this->session->userdata('id')
                ));
            }

            $this->session->set_flashdata('success', 'Producto registrado correctamente');
        } else {
            $this->session->set_flashdata('error', 'No se pudo registrar el producto');
        }


        redirect('ventas/productos');
    }

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

        $producto = $this->Producto_model->obtener($id);

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

        $data['titulo'] = 'Editar Producto';
        $data['producto'] = $producto;
        $data['almacenes'] = $this->Almacen_model->listar_activos();
        $data['categorias'] = $this->Producto_model->listar_categorias();
        $data['monedas'] = $this->Producto_model->listar_monedas();
        $data['unidades'] = $this->Producto_model->listar_unidades();
        $data['tafigv'] = $this->Producto_model->listar_tafigv();
        $data['detracciones'] = $this->Producto_model->listar_detracciones();

        $this->layout('ventas/productos/edit', $data);
    }

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

        $producto = $this->Producto_model->obtener($id);

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

        $this->form_validation->set_rules('categoria_id', 'Categoría', 'required');
        $this->form_validation->set_rules('codigo', 'Código', 'required|trim|max_length[30]');
        $this->form_validation->set_rules('nombre', 'Nombre', 'required|trim|max_length[200]');
        $this->form_validation->set_rules('bien_serv', 'Tipo', 'required');
        $this->form_validation->set_rules('tafigv_id', 'Afectación IGV', 'required');

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

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

        if ($this->Producto_model->existe_codigo($codigo, $id)) {
            $this->session->set_flashdata('error', 'El código del producto ya existe');
            redirect('ventas/productos/edit/'.$id);
        }

        $imagen = $this->subir_imagen();
        if (is_array($imagen) && isset($imagen['error'])) {
            $this->session->set_flashdata('error', $imagen['error']);
            redirect('ventas/productos/edit/'.$id);
        }

        $data = array(
            'categoria_id' => $this->input->post('categoria_id', TRUE),
            'codigo' => $codigo,
            'nombre' => $this->normalizarTexto($this->input->post('nombre', TRUE)),
            'descripcion' => trim($this->input->post('descripcion', TRUE)),

            'moneda_id_compra' => $this->input->post('moneda_id_compra', TRUE) ?: null,
            'precio_compra' => $this->input->post('precio_compra', TRUE) ?: 0,
            'um_id_compra' => $this->input->post('um_id_compra', TRUE) ?: null,

            'moneda_id_venta' => $this->input->post('moneda_id_venta', TRUE) ?: null,
            'precio_unidad' => $this->input->post('precio_unidad', TRUE) ?: 0,
            'precio_doce' => $this->input->post('precio_doce', TRUE) ?: 0,
            'precio_veinticinco' => $this->input->post('precio_veinticinco', TRUE) ?: 0,
            'precio_cincuenta' => $this->input->post('precio_cincuenta', TRUE) ?: 0,
            'precio_cien' => $this->input->post('precio_cien', TRUE) ?: 0,
            'precio_millar' => $this->input->post('precio_millar', TRUE) ?: 0,
            'um_id_venta' => $this->input->post('um_id_venta', TRUE) ?: null,

            'bien_serv' => $this->input->post('bien_serv', TRUE),
            'maneja_stock' => $this->input->post('maneja_stock', TRUE) ? 1 : 0,
            'activo_compra' => $this->input->post('activo_compra', TRUE) ? 1 : 0,
            'activo_venta' => $this->input->post('activo_venta', TRUE) ? 1 : 0,

            'tafigv_id' => $this->input->post('tafigv_id', TRUE),
            'detraccion_id' => $this->input->post('detraccion_id', TRUE) ?: null,

            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $this->session->userdata('id')
        );

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

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

        redirect('ventas/productos');
    }

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

        $producto = $this->db
            ->select('
                p.*,
                c.nombre as categoria,
                mc.nombre as moneda_compra,
                mv.nombre as moneda_venta,
                uc.nombre as unidad_compra,
                uv.nombre as unidad_venta,
                t.nombre as tafigv,
                d.nombre as detraccion
            ')
            ->from('vt_producto p')
            ->join('mt_producto_categoria c', 'c.id = p.categoria_id')
            ->join('mt_moneda mc', 'mc.id = p.moneda_id_compra', 'left')
            ->join('mt_moneda mv', 'mv.id = p.moneda_id_venta', 'left')
            ->join('mt_unidad_medida uc', 'uc.id = p.um_id_compra', 'left')
            ->join('mt_unidad_medida uv', 'uv.id = p.um_id_venta', 'left')
            ->join('mt_tipo_afectacion_igv t', 't.id = p.tafigv_id')
            ->join('mt_detraccion d', 'd.id = p.detraccion_id', 'left')
            ->where('p.id', $id)
            ->get()
            ->row();

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

        $data['titulo'] = 'Detalle de Producto';
        $data['producto'] = $producto;
        $this->layout('ventas/productos/ver', $data);
    }

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

        $producto = $this->Producto_model->obtener($id);

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

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

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

        redirect('ventas/productos');
    }
}