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

class Sunat extends MY_Controller {

    public function __construct() {

    ini_set('display_errors', 1);
    error_reporting(E_ALL);
    $this->CI =& get_instance();

        parent::__construct();
        // NO cargar SunatService aquí — se carga solo cuando se necesita enviar
        require_once(FCPATH . 'vendor/autoload.php');
    }

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

    // ---------------------------------------------------------------
    // PANEL PRINCIPAL DE ENVÍOS
    // ---------------------------------------------------------------
    public function index() {
        $this->validar_permiso('sunat_ver');

        // Comprobantes pendientes de envío
        $comprobantes = $this->db
            ->select('c.id, c.serie, c.numero, c.fecha, c.total, c.comprob_sunat,
                      cl.razon_social as cliente, tc.nombre as tipo_comprobante')
            ->from('vt_comprobante c')
            ->join('vt_cliente cl',         'cl.id = c.cliente_id')
            ->join('mt_tipo_comprobante tc', 'tc.id = c.comprobante_id')
            ->where_in('c.estado_id', array(23, 26, 27))
            ->where('c.comprob_sunat', 0) // Pendientes
            ->order_by('c.id', 'DESC')
            ->limit(50)
            ->get()->result();

        // NC pendientes
        $notas_credito = $this->db
            ->select('nc.id, nc.serie, nc.numero, nc.fecha, nc.total, nc.envio_sunat,
                      cl.razon_social as cliente, tnc.descripcion as tipo')
            ->from('vt_nota_credito nc')
            ->join('vt_cliente cl',            'cl.id = nc.cliente_id')
            ->join('mt_tipo_nota_credito tnc',  'tnc.id = nc.tipo_nc_id')
            ->where('nc.estado', 1)
            ->where('nc.envio_sunat', 0)
            ->order_by('nc.id', 'DESC')
            ->limit(50)
            ->get()->result();

        // ND pendientes
        $notas_debito = $this->db
            ->select('nd.id, nd.serie, nd.numero, nd.fecha, nd.total, nd.envio_sunat,
                      cl.razon_social as cliente, tnd.descripcion as tipo')
            ->from('vt_nota_debito nd')
            ->join('vt_cliente cl',           'cl.id = nd.cliente_id')
            ->join('mt_tipo_nota_debito tnd',  'tnd.id = nd.tipo_nd_id')
            ->where('nd.estado', 1)
            ->where('nd.envio_sunat', 0)
            ->order_by('nd.id', 'DESC')
            ->limit(50)
            ->get()->result();

        // Guías pendientes
        $guias = $this->db
            ->select('g.id, g.serie, g.numero, g.fecha_emision, g.envio_sunat,
                      cl.razon_social as cliente, m.nombre as motivo')
            ->from('al_gr_remitente g')
            ->join('vt_cliente cl',       'cl.id = g.cliente_id')
            ->join('mt_motivo_traslado m', 'm.id = g.motivo_traslado_id')
            ->where('g.estado_id', 29) // EMITIDO
            ->where('g.envio_sunat', 0)
            ->order_by('g.id', 'DESC')
            ->limit(50)
            ->get()->result();

        $empresa = $this->db->get('empresa')->row();

        $data['titulo']         = 'Envío Electrónico SUNAT';
        $data['comprobantes']   = $comprobantes;
        $data['notas_credito']  = $notas_credito;
        $data['notas_debito']   = $notas_debito;
        $data['guias']          = $guias;
        $data['empresa']        = $empresa;

        $this->layout('sunat/sunat/index', $data);
    }

    // ---------------------------------------------------------------
    // ENVIAR COMPROBANTE (AJAX)
    // ---------------------------------------------------------------
    public function enviar_comprobante() {
        $this->validar_permiso_ajax('sunat_enviar');

        $id = $this->input->post('id', TRUE);
        if (!$id) {
            echo json_encode(array('status' => false, 'message' => 'ID no válido'));
            return;
        }

        try {
            $this->load->library('SunatService');
            $resultado = $this->sunatservice->enviarComprobante($id);
            echo json_encode($resultado);
        } catch (Exception $e) {
            echo json_encode(array('status' => false, 'message' => $e->getMessage()));
        }
    }

    // ---------------------------------------------------------------
    // ENVIAR NOTA DE CRÉDITO (AJAX)
    // ---------------------------------------------------------------
    public function enviar_nota_credito() {
        $this->validar_permiso_ajax('sunat_enviar');
        $id = $this->input->post('id', TRUE);
        if (!$id) { echo json_encode(array('status' => false, 'message' => 'ID no válido')); return; }
        try {
            $this->load->library('SunatService');
            $resultado = $this->sunatservice->enviarNotaCredito($id);
            echo json_encode($resultado);
        } catch (Exception $e) {
            echo json_encode(array('status' => false, 'message' => $e->getMessage()));
        }
    }

    public function enviar_nota_debito() {
        $this->validar_permiso_ajax('sunat_enviar');
        $id = $this->input->post('id', TRUE);
        if (!$id) { echo json_encode(array('status' => false, 'message' => 'ID no válido')); return; }
        try {
            $this->load->library('SunatService');
            $resultado = $this->sunatservice->enviarNotaDebito($id);
            echo json_encode($resultado);
        } catch (Exception $e) {
            echo json_encode(array('status' => false, 'message' => $e->getMessage()));
        }
    }

    public function enviar_guia() {
        $this->validar_permiso_ajax('sunat_enviar');
        $id = $this->input->post('id', TRUE);
        if (!$id) { echo json_encode(array('status' => false, 'message' => 'ID no válido')); return; }
        try {
            $this->load->library('SunatService');
            $resultado = $this->sunatservice->enviarGuiaRemision($id);
            echo json_encode($resultado);
        } catch (Exception $e) {
            echo json_encode(array('status' => false, 'message' => $e->getMessage()));
        }
    }

    // ---------------------------------------------------------------
    // CAMBIAR MODO BETA/PRODUCCION
    // ---------------------------------------------------------------
    public function cambiar_modo() {
        $this->validar_permiso_ajax('sunat_configurar');

        $modo = $this->input->post('modo', TRUE);
        if (!in_array($modo, array('beta', 'produccion'))) {
            echo json_encode(array('status' => false, 'message' => 'Modo no válido'));
            return;
        }

        $this->db->where('id', 1)->update('empresa', array('sunat_modo' => $modo));
        echo json_encode(array('status' => true, 'message' => 'Modo cambiado a ' . strtoupper($modo)));
    }

    // ---------------------------------------------------------------
    // DESCARGAR XML
    // ---------------------------------------------------------------
    public function descargar($tipo, $id) {
        $this->validar_permiso('sunat_ver');

        switch ($tipo) {
            case 'xml':
                $comprob = $this->db->where('id', $id)->get('vt_comprobante')->row();
                if (!$comprob || empty($comprob->xml_path)) {
                    $this->session->set_flashdata('error', 'XML no disponible.');
                    redirect('ventas/comprobante/ver/' . $id);
                }
                $path = FCPATH . $comprob->xml_path;
                $nombre = $comprob->serie . '-' . $comprob->numero . '.xml';
                $mime = 'application/xml';
                break;

            case 'cdr':
                $comprob = $this->db->where('id', $id)->get('vt_comprobante')->row();
                if (!$comprob || empty($comprob->cdr_path)) {
                    $this->session->set_flashdata('error', 'CDR no disponible.');
                    redirect('ventas/comprobante/ver/' . $id);
                }
                $path = FCPATH . $comprob->cdr_path;
                $nombre = 'R-' . $comprob->serie . '-' . $comprob->numero . '.zip';
                $mime = 'application/zip';
                break;

            default:
                show_404();
                return;
        }

        if (!file_exists($path)) {
            $this->session->set_flashdata('error', 'Archivo no encontrado en el servidor.');
            redirect('ventas/comprobante/ver/' . $id);
        }

        header('Content-Type: ' . $mime);
        header('Content-Disposition: attachment; filename="' . $nombre . '"');
        header('Content-Length: ' . filesize($path));
        readfile($path);
        exit;
    }

    
}
