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

class ComprobanteProveedor extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('logistica/ComprobanteProveedor_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('comprobante_proveedor_ver');

        $data['titulo']       = 'Comprobantes de Proveedor';
        $data['comprobantes'] = $this->ComprobanteProveedor_model->listar();
        $this->layout('logistica/comprobante_proveedor/index', $data);
    }

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

        $data['titulo']       = 'Nuevo Comprobante de Proveedor';
        $data['monedas']      = $this->ComprobanteProveedor_model->listar_monedas();
        $data['formas_pago']  = $this->ComprobanteProveedor_model->listar_formas_pago();
        $data['detracciones'] = $this->ComprobanteProveedor_model->listar_detracciones();
        $this->layout('logistica/comprobante_proveedor/create', $data);
    }

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

        $this->form_validation->set_rules('proveedor_id',      'Proveedor',        'required');
        $this->form_validation->set_rules('tipo_comprobante',  'Tipo comprobante', 'required');
        $this->form_validation->set_rules('serie',             'Serie',            'required|trim|max_length[10]');
        $this->form_validation->set_rules('numero',            'Número',           'required|trim|max_length[20]');
        $this->form_validation->set_rules('fecha_emision',     'Fecha emisión',    'required');
        $this->form_validation->set_rules('moneda_id',         'Moneda',           'required');
        $this->form_validation->set_rules('total',             'Total',            'required');

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

        $proveedor_id     = $this->input->post('proveedor_id', TRUE);
        $tipo_comprobante = $this->input->post('tipo_comprobante', TRUE);
        $serie            = strtoupper(trim($this->input->post('serie', TRUE)));
        $numero           = trim($this->input->post('numero', TRUE));
        $fecha_emision    = $this->input->post('fecha_emision', TRUE);
        $fecha_vencimiento= $this->input->post('fecha_vencimiento', TRUE) ?: null;
        $moneda_id        = $this->input->post('moneda_id', TRUE);
        $tipocambio       = $this->input->post('tipocambio', TRUE) ?: null;
        $subtotal         = (float)$this->input->post('subtotal', TRUE);
        $igv_porcentaje   = (float)$this->input->post('igv_porcentaje', TRUE);
        $igv              = (float)$this->input->post('igv', TRUE);
        $total            = (float)$this->input->post('total', TRUE);
        $fp_id            = $this->input->post('fp_id', TRUE) ?: null;
        $ordc_id          = $this->input->post('ordc_id', TRUE) ?: null;
        $pi_id            = $this->input->post('pi_id', TRUE) ?: null;
        $detraccion_id    = $this->input->post('detraccion_id', TRUE) ?: null;
        $importe_detraccion = (float)$this->input->post('importe_detraccion', TRUE);
        $observaciones    = trim($this->input->post('observaciones', TRUE));
        $cuotas           = $this->input->post('cuotas');

        // Verificar duplicado
        if ($this->ComprobanteProveedor_model->existe_comprobante($proveedor_id, $tipo_comprobante, $serie, $numero)) {
            $this->session->set_flashdata('error', 'Ya existe un comprobante con esa serie y número para este proveedor');
            redirect('logistica/comprobante_proveedor/create');
        }

        $cabecera = array(
            'proveedor_id'      => $proveedor_id,
            'ordc_id'           => $ordc_id,
            'pi_id'             => $pi_id,
            'tipo_comprobante'  => $tipo_comprobante,
            'serie'             => $serie,
            'numero'            => $numero,
            'fecha_emision'     => $fecha_emision,
            'fecha_vencimiento' => $fecha_vencimiento,
            'moneda_id'         => $moneda_id,
            'tipocambio'        => $tipocambio,
            'subtotal'          => $subtotal,
            'igv_porcentaje'    => $igv_porcentaje,
            'igv'               => $igv,
            'total'             => $total,
            'saldo'             => $total,
            'fp_id'             => $fp_id,
            'detraccion_id'     => $detraccion_id,
            'importe_detraccion'=> $importe_detraccion,
            'observaciones'     => $observaciones !== '' ? $observaciones : null,
            'estado'            => 1, // PENDIENTE
            'created_by'        => $this->session->userdata('id')
        );

        $this->db->trans_begin();

        $cp_id = $this->ComprobanteProveedor_model->insertar($cabecera);

        if (!$cp_id) {
            $this->db->trans_rollback();
            $this->session->set_flashdata('error', 'No se pudo registrar el comprobante');
            redirect('logistica/comprobante_proveedor/create');
        }

        // Insertar cuotas si las hay
        if (!empty($cuotas) && is_array($cuotas)) {
            $cuotasInsert = array();
            foreach ($cuotas as $cuota) {
                $importe = (float)$cuota['importe'];
                if ($importe <= 0) continue;
                $cuotasInsert[] = array(
                    'cp_id'             => $cp_id,
                    'nro_cuota'         => (int)$cuota['nro_cuota'],
                    'fecha_vencimiento' => $cuota['fecha_vencimiento'],
                    'importe'           => $importe,
                    'saldo'             => $importe,
                    'estado'            => 0
                );
            }
            if (!empty($cuotasInsert)) {
                $this->ComprobanteProveedor_model->insertar_cuotas_batch($cuotasInsert);
            }
        }

        // Cerrar OC si fue referenciada
        if ($ordc_id) {
            $this->ComprobanteProveedor_model->cerrar_oc($ordc_id);
        }

        // Marcar PI como facturado
        if ($pi_id) {
            $this->ComprobanteProveedor_model->marcar_pi_facturado($pi_id);
        }

        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
            $this->session->set_flashdata('error', 'Error al guardar el comprobante');
            redirect('logistica/comprobante_proveedor/create');
        }

        $this->db->trans_commit();

        $this->session->set_flashdata('success', 'Comprobante ' . $serie . '-' . $numero . ' registrado correctamente');
        redirect('logistica/comprobante_proveedor');
    }

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

        $comprobante = $this->ComprobanteProveedor_model->obtener_completo($id);
        if (!$comprobante) show_404();

        $data['titulo']       = 'Detalle Comprobante Proveedor';
        $data['comprobante']  = $comprobante;
        $data['cuotas']       = $this->ComprobanteProveedor_model->obtener_cuotas($id);
        $data['pagos']        = $this->ComprobanteProveedor_model->obtener_pagos($id);
        $data['medios_pago']  = $this->ComprobanteProveedor_model->listar_medios_pago();
        $data['cuentas']      = $this->ComprobanteProveedor_model->listar_cuentas_bancarias();
        $this->layout('logistica/comprobante_proveedor/ver', $data);
    }

    // ---------------------------------------------------------------
    // REGISTRAR PAGO (AJAX)
    // ---------------------------------------------------------------
    public function registrar_pago() {
        $this->validar_permiso_ajax('comprobante_proveedor_pagar');

        $cp_id          = $this->input->post('cp_id', TRUE);
        $cuota_id       = $this->input->post('cuota_id', TRUE) ?: null;
        $fecha_pago     = $this->input->post('fecha_pago', TRUE);
        $medio_pago_id  = $this->input->post('medio_pago_id', TRUE);
        $banco_cuenta_id= $this->input->post('banco_cuenta_id', TRUE) ?: null;
        $importe        = (float)$this->input->post('importe', TRUE);
        $referencia     = trim($this->input->post('referencia', TRUE));
        $observaciones  = trim($this->input->post('observaciones', TRUE));

        if ($importe <= 0) {
            echo json_encode(array('status' => false, 'message' => 'El importe debe ser mayor a 0'));
            return;
        }

        $comprobante = $this->ComprobanteProveedor_model->obtener($cp_id);
        if (!$comprobante) {
            echo json_encode(array('status' => false, 'message' => 'Comprobante no encontrado'));
            return;
        }

        if ($importe > (float)$comprobante->saldo) {
            echo json_encode(array('status' => false, 'message' => 'El importe supera el saldo pendiente (' . number_format($comprobante->saldo, 2) . ')'));
            return;
        }

        $this->db->trans_begin();

        // Registrar pago
        $this->ComprobanteProveedor_model->registrar_pago(array(
            'cp_id'           => $cp_id,
            'cuota_id'        => $cuota_id,
            'fecha_pago'      => $fecha_pago,
            'medio_pago_id'   => $medio_pago_id,
            'banco_cuenta_id' => $banco_cuenta_id,
            'importe'         => $importe,
            'referencia'      => $referencia !== '' ? $referencia : null,
            'observaciones'   => $observaciones !== '' ? $observaciones : null,
            'created_by'      => $this->session->userdata('id')
        ));

        // Actualizar saldo del comprobante
        $nuevo_saldo  = round((float)$comprobante->saldo - $importe, 2);
        $nuevo_estado = $nuevo_saldo <= 0 ? 2 : 1; // 2=PAGADO

        $this->ComprobanteProveedor_model->actualizar($cp_id, array(
            'saldo'      => $nuevo_saldo,
            'estado'     => $nuevo_estado,
            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $this->session->userdata('id')
        ));

        // Si tiene cuota, actualizar saldo de la cuota
        if ($cuota_id) {
            $cuota = $this->db->where('id', $cuota_id)->get('cp_comprobante_proveedor_cuota')->row();
            if ($cuota) {
                $saldo_cuota  = max(0, round((float)$cuota->saldo - $importe, 2));
                $estado_cuota = $saldo_cuota <= 0 ? 1 : 0;
                $this->ComprobanteProveedor_model->actualizar_cuota($cuota_id, array(
                    'saldo'  => $saldo_cuota,
                    'estado' => $estado_cuota
                ));
            }
        }

        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
            echo json_encode(array('status' => false, 'message' => 'Error al registrar el pago'));
            return;
        }

        $this->db->trans_commit();

        echo json_encode(array(
            'status'      => true,
            'message'     => 'Pago registrado correctamente',
            'nuevo_saldo' => number_format($nuevo_saldo, 2),
            'pagado'      => $nuevo_estado == 2
        ));
    }

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

        $comprobante = $this->ComprobanteProveedor_model->obtener($id);
        if (!$comprobante) show_404();

        if ($comprobante->estado == 3) {
            $this->session->set_flashdata('error', 'El comprobante ya está anulado');
            redirect('logistica/comprobante_proveedor');
        }

        if ($comprobante->saldo < $comprobante->total) {
            $this->session->set_flashdata('error', 'No se puede anular un comprobante con pagos registrados');
            redirect('logistica/comprobante_proveedor');
        }

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

        $this->session->set_flashdata('success', 'Comprobante anulado correctamente');
        redirect('logistica/comprobante_proveedor');
    }

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

        $proveedores = $this->ComprobanteProveedor_model->buscar_proveedor($term);
        $resultado   = array();
        foreach ($proveedores 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,
                'fp_id'         => $item->fp_id,
                'moneda_id'     => $item->moneda_id
            );
        }
        echo json_encode($resultado);
    }

    // ---------------------------------------------------------------
    // AJAX - OC Y PARTES DEL PROVEEDOR
    // ---------------------------------------------------------------
    public function oc_proveedor($proveedor_id) {
        $this->validar_permiso_ajax('comprobante_proveedor_crear');
        $ocs = $this->ComprobanteProveedor_model->listar_oc_autorizadas_proveedor($proveedor_id);
        echo json_encode($ocs);
    }

    public function partes_proveedor($proveedor_id) {
        $this->validar_permiso_ajax('comprobante_proveedor_crear');
        $partes = $this->ComprobanteProveedor_model->listar_partes_ingreso_proveedor($proveedor_id);
        echo json_encode($partes);
    }
}
