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

class ParteSalida extends MY_Controller {

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

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

    // ---------------------------------------------------------------
    // LISTADO
    // ---------------------------------------------------------------
    public function index() {
        $this->validar_permiso('parte_salida_ver');

        $data['titulo'] = 'Partes de Salida';
        $data['partes'] = $this->ParteSalida_model->listar();
        $this->layout('almacen/parte_salida/index', $data);
    }

    // ---------------------------------------------------------------
    // FORMULARIO NUEVO
    // ---------------------------------------------------------------
    public function create() {
        $this->validar_permiso('parte_salida_crear');

        $data['titulo']    = 'Nuevo Parte de Salida';
        $data['almacenes'] = $this->ParteSalida_model->listar_almacenes();
        $data['empleados'] = $this->ParteSalida_model->listar_empleados();
        $this->layout('almacen/parte_salida/create', $data);
    }

    // ---------------------------------------------------------------
    // GUARDAR
    // ---------------------------------------------------------------
    public function store() {
        $this->validar_permiso('parte_salida_crear');

        $this->form_validation->set_rules('tiposalida', 'Tipo de salida', 'required');
        $this->form_validation->set_rules('fecha',      'Fecha',          'required');
        $this->form_validation->set_rules('almacen_id', 'Almacén',        'required');

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

        $tiposalida  = $this->input->post('tiposalida', TRUE);
        $fecha       = $this->input->post('fecha', TRUE);
        $almacen_id  = $this->input->post('almacen_id', TRUE);
        $cliente_id  = $this->input->post('cliente_id', TRUE) ?: null;
        $empleado_id = $this->input->post('empleado_id', TRUE) ?: null;
        $observaciones = trim($this->input->post('observaciones', TRUE));
        $detalle     = $this->input->post('detalle');

        // Validaciones según tipo
        if ($tiposalida == 'V' && empty($cliente_id)) {
            $this->session->set_flashdata('error', 'Debes seleccionar un cliente para salida por venta');
            redirect('almacen/parte_salida/create');
        }

        if ($tiposalida == 'C' && empty($empleado_id)) {
            $this->session->set_flashdata('error', 'Debes seleccionar el empleado para consumo interno');
            redirect('almacen/parte_salida/create');
        }

        if (empty($detalle) || !is_array($detalle)) {
            $this->session->set_flashdata('error', 'Debes agregar al menos un producto al detalle');
            redirect('almacen/parte_salida/create');
        }

        $detalleInsert = array();

        foreach ($detalle as $item) {
            $producto_id     = isset($item['producto_id'])     ? (int)$item['producto_id']      : 0;
            $descripcion     = isset($item['detalle'])         ? trim($item['detalle'])          : '';
            $cantidad        = isset($item['cantidad'])        ? (float)$item['cantidad']        : 0;
            $precio_unitario = isset($item['precio_unitario']) ? (float)$item['precio_unitario'] : 0;

            if ($producto_id <= 0 || $cantidad <= 0) continue;

            $subtotal = round($cantidad * $precio_unitario, 2);

            $detalleInsert[] = array(
                'producto_id'     => $producto_id,
                'detalle'         => $descripcion,
                'cantidad'        => $cantidad,
                'precio_unitario' => round($precio_unitario, 4),
                'subtotal'        => $subtotal
            );
        }

        if (empty($detalleInsert)) {
            $this->session->set_flashdata('error', 'No hay detalle válido para registrar');
            redirect('almacen/parte_salida/create');
        }

        $cabecera = array(
            'tiposalida'   => $tiposalida,
            'fecha'        => $fecha,
            'almacen_id'   => $almacen_id,
            'cliente_id'   => $cliente_id,
            'empleado_id'  => $empleado_id,
            'comprob_id'   => null,
            'observaciones'=> $observaciones !== '' ? $observaciones : null,
            'estado'       => 1,
            'created_by'   => $this->session->userdata('id')
        );

        $this->db->trans_begin();

        $ps_id = $this->ParteSalida_model->insertar_cabecera($cabecera);

        if (!$ps_id) {
            $this->db->trans_rollback();
            $this->session->set_flashdata('error', 'No se pudo registrar el parte de salida');
            redirect('almacen/parte_salida/create');
        }

        foreach ($detalleInsert as &$d) {
            $d['ps_id'] = $ps_id;
        }
        unset($d);

        $this->ParteSalida_model->insertar_detalle_batch($detalleInsert);

        // Descontar stock
        foreach ($detalleInsert as $d) {
            $producto = $this->db->where('id', $d['producto_id'])->get('vt_producto')->row();
            if ($producto && $producto->maneja_stock) {
                $this->ParteSalida_model->descontar_stock($d['producto_id'], $almacen_id, $d['cantidad']);
            }
        }

        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
            $this->session->set_flashdata('error', 'Ocurrió un error al guardar el parte de salida');
            redirect('almacen/parte_salida/create');
        }

        $this->db->trans_commit();

        $this->session->set_flashdata('success', 'Parte de salida N° ' . $ps_id . ' registrado correctamente');
        redirect('almacen/parte_salida');
    }

    // ---------------------------------------------------------------
    // VER DETALLE
    // ---------------------------------------------------------------
    public function ver($id) {
        $this->validar_permiso('parte_salida_ver');

        $parte = $this->ParteSalida_model->obtener_completo($id);
        if (!$parte) show_404();

        $data['titulo']  = 'Detalle Parte de Salida N° ' . $id;
        $data['parte']   = $parte;
        $data['detalle'] = $this->ParteSalida_model->obtener_detalle($id);
        $this->layout('almacen/parte_salida/ver', $data);
    }

    // ---------------------------------------------------------------
    // ANULAR
    // ---------------------------------------------------------------
    public function anular($id) {
        $this->validar_permiso('parte_salida_anular');

        $parte = $this->ParteSalida_model->obtener($id);
        if (!$parte) show_404();

        if ($parte->estado == 0) {
            $this->session->set_flashdata('error', 'El parte de salida ya se encuentra anulado');
            redirect('almacen/parte_salida');
        }

        // No permitir anular si viene de un comprobante
        if (!empty($parte->comprob_id)) {
            $this->session->set_flashdata('error', 'No se puede anular un parte de salida generado por un comprobante. Anule el comprobante directamente.');
            redirect('almacen/parte_salida');
        }

        $detalle = $this->ParteSalida_model->obtener_detalle($id);

        $this->db->trans_begin();

        $this->ParteSalida_model->anular($id, $this->session->userdata('id'));

        // Revertir stock
        foreach ($detalle as $d) {
            if ($d->maneja_stock) {
                $this->ParteSalida_model->revertir_stock($d->producto_id, $parte->almacen_id, $d->cantidad);
            }
        }

        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
            $this->session->set_flashdata('error', 'No se pudo anular el parte de salida');
            redirect('almacen/parte_salida');
        }

        $this->db->trans_commit();

        $this->session->set_flashdata('success', 'Parte de salida N° ' . $id . ' anulado correctamente');
        redirect('almacen/parte_salida');
    }

    // ---------------------------------------------------------------
    // AJAX - CLIENTE
    // ---------------------------------------------------------------
    public function buscar_cliente() {
        $this->validar_permiso_ajax('parte_salida_crear');
        $term = trim($this->input->get('term', TRUE));
        if (strlen($term) < 2) { echo json_encode(array()); return; }

        $clientes  = $this->ParteSalida_model->buscar_cliente($term);
        $resultado = array();
        foreach ($clientes as $item) {
            $resultado[] = array(
                'id'            => $item->id,
                'label'         => $item->razon_social . ' | ' . $item->nro_documento,
                'value'         => $item->razon_social,
                'razon_social'  => $item->razon_social,
                'nro_documento' => $item->nro_documento
            );
        }
        echo json_encode($resultado);
    }

    // ---------------------------------------------------------------
    // AJAX - PRODUCTO
    // ---------------------------------------------------------------
    public function buscar_producto() {
        $this->validar_permiso_ajax('parte_salida_crear');
        $term       = trim($this->input->get('term', TRUE));
        $almacen_id = $this->input->get('almacen_id', TRUE);
        if (strlen($term) < 2) { echo json_encode(array()); return; }

        $productos = $this->ParteSalida_model->buscar_producto($term, $almacen_id);
        $resultado = array();
        foreach ($productos as $item) {
            $resultado[] = array(
                'id'               => $item->id,
                'label'            => $item->codigo . ' | ' . $item->nombre . ' (Stock: ' . $item->cantidad_stock . ')',
                'value'            => $item->nombre,
                'codigo'           => $item->codigo,
                'nombre'           => $item->nombre,
                'unidad_abreviado' => $item->unidad_abreviado,
                'precio_unidad'    => $item->precio_unidad,
                'cantidad_stock'   => $item->cantidad_stock,
                'maneja_stock'     => $item->maneja_stock
            );
        }
        echo json_encode($resultado);
    }
}
