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

class NotaDebito extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('ventas/NotaDebito_model');
        $this->load->helper('numero');
    }

    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('nota_debito_ver');

        $data['titulo'] = 'Notas de Débito';
        $data['notas']  = $this->NotaDebito_model->listar();
        $this->layout('ventas/nota_debito/index', $data);
    }

    // ---------------------------------------------------------------
    // PASO 1 — Selección tipo + comprobante
    // ---------------------------------------------------------------
    public function create() {
        $this->validar_permiso('nota_debito_crear');

        $data['titulo']   = 'Nueva Nota de Débito';
        $data['tipos_nd'] = $this->NotaDebito_model->listar_tipos_nd();
        $this->layout('ventas/nota_debito/create_paso1', $data);
    }

    // ---------------------------------------------------------------
    // PASO 2 — Formulario importe y sustento
    // ---------------------------------------------------------------
    public function create_paso2() {
        $this->validar_permiso('nota_debito_crear');

        $tipo_nd_id = $this->input->post('tipo_nd_id', TRUE);
        $comprob_id = $this->input->post('comprob_id', TRUE);
        $fecha      = $this->input->post('fecha', TRUE);

        if (!$tipo_nd_id || !$comprob_id || !$fecha) {
            $this->session->set_flashdata('error', 'Debe seleccionar tipo, comprobante y fecha');
            redirect('ventas/nota_debito/create');
        }

        $tipo_nd     = $this->db->where('id', $tipo_nd_id)->get('mt_tipo_nota_debito')->row();
        $comprobante = $this->NotaDebito_model->obtener_completo_comprobante($comprob_id);
        $serie       = $this->NotaDebito_model->obtener_serie_nd($comprob_id);
        $numero      = $this->NotaDebito_model->siguiente_numero($serie);

        $data['titulo']      = 'Nueva Nota de Débito — ' . $tipo_nd->descripcion;
        $data['tipo_nd']     = $tipo_nd;
        $data['comprobante'] = $comprobante;
        $data['fecha']       = $fecha;
        $data['serie']       = $serie;
        $data['numero']      = $numero;

        $this->layout('ventas/nota_debito/create_paso2', $data);
    }

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

        $tipo_nd_id = $this->input->post('tipo_nd_id', TRUE);
        $comprob_id = $this->input->post('comprob_id', TRUE);
        $fecha      = $this->input->post('fecha', TRUE);
        $serie      = $this->input->post('serie', TRUE);
        $numero     = $this->input->post('numero', TRUE);
        $moneda_id  = $this->input->post('moneda_id', TRUE);
        $tipocambio = (float)$this->input->post('tipocambio', TRUE);
        $igv_porc   = (float)$this->input->post('igv_porcentaje', TRUE);
        $subtotal   = (float)$this->input->post('subtotal', TRUE);
        $igv        = (float)$this->input->post('igv', TRUE);
        $total      = (float)$this->input->post('total', TRUE);
        $sustento   = trim($this->input->post('sustento', TRUE));
        $cliente_id = $this->input->post('cliente_id', TRUE);
        $descripcion= trim($this->input->post('descripcion', TRUE));

        if (!$tipo_nd_id || !$comprob_id || !$fecha || !$cliente_id || $total <= 0) {
            $this->session->set_flashdata('error', 'Faltan datos obligatorios');
            redirect('ventas/nota_debito/create');
        }

        $this->db->trans_begin();

        $nd_id = $this->NotaDebito_model->insertar(array(
            'tipo_nd_id'     => $tipo_nd_id,
            'serie'          => $serie,
            'numero'         => $numero,
            'comprob_id'     => $comprob_id,
            'cliente_id'     => $cliente_id,
            'fecha'          => $fecha,
            'moneda_id'      => $moneda_id,
            'tipocambio'     => $tipocambio,
            'subtotal'       => $subtotal,
            'igv_porcentaje' => $igv_porc,
            'igv'            => $igv,
            'total'          => $total,
            'sustento'       => $sustento !== '' ? $sustento : null,
            'envio_sunat'    => 0,
            'estado'         => 1,
            'created_by'     => $this->session->userdata('id')
        ));

        if (!$nd_id) {
            $this->db->trans_rollback();
            $this->session->set_flashdata('error', 'No se pudo registrar la nota de débito');
            redirect('ventas/nota_debito/create');
        }

        // Insertar detalle — un solo ítem con el cargo
        $this->NotaDebito_model->insertar_detalle(array(
            'nd_id'               => $nd_id,
            'producto_id'         => null,
            'descripcion'         => $descripcion !== '' ? $descripcion : $sustento,
            'cantidad'            => 1,
            'precio_unitario'     => $subtotal,
            'tipo_afectacion_igv' => '10',
            'igv'                 => $igv,
            'subtotal'            => $subtotal,
            'total'               => $total
        ));

        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
            $this->session->set_flashdata('error', 'Error al guardar la nota de débito');
            redirect('ventas/nota_debito/create');
        }

        $this->db->trans_commit();

        $this->session->set_flashdata('success', 'Nota de Débito ' . $serie . '-' . $numero . ' registrada correctamente');
        redirect('ventas/nota_debito/ver/' . $nd_id);
    }

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

        $nd = $this->NotaDebito_model->obtener_completo($id);
        if (!$nd) show_404();

        $data['titulo']  = 'Nota de Débito ' . $nd->serie . '-' . $nd->numero;
        $data['nd']      = $nd;
        $data['detalle'] = $this->NotaDebito_model->obtener_detalle($id);
        $this->layout('ventas/nota_debito/ver', $data);
    }

    // ---------------------------------------------------------------
    // IMPRIMIR
    // ---------------------------------------------------------------
    public function print_nd($id) {
        $this->validar_permiso('nota_debito_ver');

        $nd = $this->NotaDebito_model->obtener_completo($id);
        if (!$nd) show_404();

        $empresa       = $this->db->get('empresa')->row();
        $montoEnLetras = numero_a_letras((float)$nd->total, !empty($nd->moneda) ? $nd->moneda : 'SOLES');

        $data['nd']            = $nd;
        $data['detalle']       = $this->NotaDebito_model->obtener_detalle($id);
        $data['empresa']       = $empresa;
        $data['montoEnLetras'] = $montoEnLetras;

        $this->load->view('ventas/nota_debito/print', $data);
    }

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

        $nd = $this->NotaDebito_model->obtener($id);
        if (!$nd) show_404();

        if ($nd->estado == 0) {
            $this->session->set_flashdata('error', 'La nota de débito ya está anulada');
            redirect('ventas/nota_debito');
        }

        if ($nd->envio_sunat == 1) {
            $this->session->set_flashdata('error', 'No se puede anular una nota de débito ya enviada a SUNAT');
            redirect('ventas/nota_debito');
        }

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

        $this->session->set_flashdata('success', 'Nota de débito anulada correctamente');
        redirect('ventas/nota_debito');
    }

    // ---------------------------------------------------------------
    // AJAX — buscar comprobante
    // ---------------------------------------------------------------
    public function buscar_comprobante() {
        $this->validar_permiso_ajax('nota_debito_crear');
        $term = trim($this->input->get('term', TRUE));
        if (strlen($term) < 2) { echo json_encode(array()); return; }

        $comprobantes = $this->NotaDebito_model->buscar_comprobante($term);
        $resultado    = array();
        foreach ($comprobantes as $item) {
            $resultado[] = array(
                'id'               => $item->id,
                'label'            => $item->serie . '-' . $item->numero . ' | ' . $item->cliente . ' | S/ ' . number_format((float)$item->total, 2),
                'value'            => $item->serie . '-' . $item->numero,
                'serie'            => $item->serie,
                'numero'           => $item->numero,
                'cliente'          => $item->cliente,
                'cliente_ruc'      => $item->cliente_ruc,
                'cliente_id'       => $item->cliente_id,
                'fecha'            => $item->fecha,
                'total'            => number_format((float)$item->total, 2),
                'moneda_id'        => $item->moneda_id,
                'moneda'           => $item->moneda,
                'igv_porcentaje'   => $item->igv_porcentaje,
                'tipo_comprobante' => $item->tipo_comprobante
            );
        }
        echo json_encode($resultado);
    }
}
