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

require APPPATH . 'libraries/RestController.php';
require APPPATH . 'libraries/Format.php';

use chriskacerguis\RestServer\RestController;

class Ventas_tag extends RestController {
    
    function __construct() {
        parent::__construct();
        $this->load->helper('session');
        $this->load->helper('url');
        $this->load->model('tags_model');
        $this->load->model('tags_movimientos_model');
    }
    public function imprime_ticket_recarga_por_tag_get($tag_id) {
        if (!$tag_id) {
            $this->response(['message' => 'ID de TAG no proporcionado', 'error' => true], RestController::HTTP_BAD_REQUEST);
            return;
        }
        
        // Buscar la última recarga para este TAG
        $recarga = $this->tags_movimientos_model->get_last_recharge_by_tag_id($tag_id);
        
        if (!$recarga) {
            $this->response(['message' => 'No se encontraron recargas para este TAG', 'error' => true], RestController::HTTP_NOT_FOUND);
            return;
        }
        
        // Redirigir a la impresión de ticket normal usando el ID de la recarga
        redirect('ventas_tag/imprime_ticket_recarga/' . $recarga['id']);
    }
    public function get_all_movimientos_get() {
        $movimientos = $this->tags_movimientos_model->get_all_movimientos();
        
        $this->response([
            'movimientos' => $movimientos,
            'total_registros' => count($movimientos),
            'total_monto' => array_sum(array_column($movimientos, 'monto')),
            'error' => false
        ], RestController::HTTP_OK);
    }
    
    public function get_recargas_reporte_get() {
        // Capturar los filtros de la petición GET
        $filtros = array(
            'fecha_inicio' => $this->get('fecha_inicio'),
            'fecha_fin' => $this->get('fecha_fin'),
            'tipo_movimiento' => $this->get('tipo_movimiento'),
            'tag_id' => $this->get('tag_id'),
            'numero_economico_id' => $this->get('numero_economico_id')
        );
        
        // Registrar los filtros recibidos en el log para depuración
        log_message('debug', 'Filtros recibidos en Ventas_tag::get_recargas_reporte_get: ' . json_encode($filtros));
        
        // Verificar existencia de datos
        $hay_datos = $this->tags_movimientos_model->verificar_existencia_datos();
        if (!$hay_datos) {
            $this->response([
                'movimientos' => [],
                'message' => 'No hay datos en la tabla de movimientos',
                'error' => false
            ], RestController::HTTP_OK);
            return;
        }
        
        // Aplicar filtros verificando que no estén vacíos
        $filtros_aplicables = array();
        
        if (!empty($filtros['fecha_inicio'])) {
            $filtros_aplicables['fecha_inicio'] = $filtros['fecha_inicio'];
        }
        
        if (!empty($filtros['fecha_fin'])) {
            $filtros_aplicables['fecha_fin'] = $filtros['fecha_fin'];
        }
        
        if (!empty($filtros['tipo_movimiento']) && $filtros['tipo_movimiento'] !== 'TODOS') {
            $filtros_aplicables['tipo_movimiento'] = $filtros['tipo_movimiento'];
        }
        
        if (!empty($filtros['tag_id'])) {
            $filtros_aplicables['tag_id'] = $filtros['tag_id'];
        }
        
        if (!empty($filtros['numero_economico_id'])) {
            $filtros_aplicables['numero_economico_id'] = $filtros['numero_economico_id'];
        }
        
        // Registrar los filtros aplicables en el log
        log_message('debug', 'Filtros aplicables: ' . json_encode($filtros_aplicables));
        
        // Obtener movimientos con los filtros aplicables
        $movimientos = $this->tags_movimientos_model->get_movimientos_by_filtros($filtros_aplicables);
        
        if (!empty($movimientos)) {
            $total_monto = 0;
            foreach ($movimientos as $mov) {
                $total_monto += floatval($mov['monto']);
            }
            
            $this->response([
                'movimientos' => $movimientos,
                'total_registros' => count($movimientos),
                'total_monto' => $total_monto,
                'error' => false
            ], RestController::HTTP_OK);
        } else {
            $this->response([
                'movimientos' => [],
                'total_registros' => 0,
                'total_monto' => 0,
                'message' => 'No se encontraron movimientos con los filtros especificados',
                'error' => false
            ], RestController::HTTP_OK);
        }
    }
    
    public function imprime_ticket_recarga_get($id) {
        if (!$id) {
            $this->response(['message' => 'ID de recarga no proporcionado', 'error' => true], RestController::HTTP_BAD_REQUEST);
            return;
        }
        
        $recarga = $this->tags_movimientos_model->get_recarga_by_id($id);
        
        if (!$recarga) {
            $this->response(['message' => 'No se encontró la recarga solicitada', 'error' => true], RestController::HTTP_NOT_FOUND);
            return;
        }
        
        // Obtener datos del TAG
        $tag = $this->tags_model->get_tag_by_id($recarga['tag_id']);
        
        $data = array(
            'recarga' => $recarga,
            'tag' => $tag,
            'base_url' => base_url()
        );
        
        $this->_generar_ticket_recarga($data);
    }

    // Método para exportar a Excel
    public function exportar_recargas_excel_get() {
        $filtros = array(
            'fecha_inicio' => $this->get('fecha_inicio', date('Y-m-d')),
            'fecha_fin' => $this->get('fecha_fin', date('Y-m-d')),
            'tipo_movimiento' => $this->get('tipo_movimiento', 'RECARGA'),
            'tag_id' => $this->get('tag_id'),
            'numero_economico_id' => $this->get('numero_economico_id')
        );
        
        // Log para depuración
        log_message('debug', 'Filtros recibidos en exportar_recargas_excel: ' . json_encode($filtros));
        
        // Obtener movimientos
        $movimientos = $this->tags_movimientos_model->get_movimientos_by_filtros($filtros);
        
        if (empty($movimientos)) {
            $this->response(['message' => 'No hay datos para exportar', 'error' => true], RestController::HTTP_OK);
            return;
        }
        
        try {
            // Crear Excel
            require_once APPPATH . '../vendor/autoload.php';
            
            $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
            $sheet = $spreadsheet->getActiveSheet();
            
            // Encabezados
            $sheet->setCellValue('A1', 'Referencia');
            $sheet->setCellValue('B1', 'TAG');
            $sheet->setCellValue('C1', 'Número Económico');
            $sheet->setCellValue('D1', 'Tipo Movimiento');
            $sheet->setCellValue('E1', 'Monto');
            $sheet->setCellValue('F1', 'Saldo Anterior');
            $sheet->setCellValue('G1', 'Saldo Nuevo');
            $sheet->setCellValue('H1', 'Fecha');
            
            // Formato de encabezados
            $styleHeader = [
                'font' => [
                    'bold' => true,
                    'color' => ['rgb' => 'FFFFFF'],
                ],
                'fill' => [
                    'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
                    'color' => ['rgb' => '4F81BD'],
                ],
                'alignment' => [
                    'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
                ],
            ];
            $sheet->getStyle('A1:H1')->applyFromArray($styleHeader);
            
            // Datos
            $row = 2;
            foreach ($movimientos as $mov) {
                $sheet->setCellValue('A' . $row, $mov['referencia']);
                $sheet->setCellValue('B' . $row, $mov['numero_tag']);
                $sheet->setCellValue('C' . $row, $mov['numero_economico'] ?? 'N/A');
                $sheet->setCellValue('D' . $row, $mov['tipo_movimiento']);
                $sheet->setCellValue('E' . $row, $mov['monto']);
                $sheet->setCellValue('F' . $row, $mov['saldo_anterior']);
                $sheet->setCellValue('G' . $row, $mov['saldo_nuevo']);
                $sheet->setCellValue('H' . $row, date('d/m/Y H:i', strtotime($mov['created_at'])));
                $row++;
            }
            
            // Formato de moneda para columnas de montos
            $sheet->getStyle('E2:G' . ($row-1))->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_CURRENCY_USD_SIMPLE);
            
            // Autoajustar columnas
            foreach(range('A', 'H') as $col) {
                $sheet->getColumnDimension($col)->setAutoSize(true);
            }
            
            // Guardar archivo
            $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
            $filename = 'reporte_recargas_' . date('YmdHis') . '.xlsx';
            $filepath = FCPATH . 'uploads/' . $filename;
            
            // Asegurar que la carpeta existe
            if (!is_dir(FCPATH . 'uploads')) {
                mkdir(FCPATH . 'uploads', 0777, true);
            }
            
            $writer->save($filepath);
            
            $this->response([
                'url' => base_url('uploads/' . $filename),
                'error' => false
            ], RestController::HTTP_OK);
            
        } catch (\Exception $e) {
            log_message('error', 'Error al generar Excel: ' . $e->getMessage());
            $this->response(['message' => 'Error al generar el Excel: ' . $e->getMessage(), 'error' => true], RestController::HTTP_INTERNAL_ERROR);
        }
    }
    
    // Método para generar PDF
    public function exportar_recargas_pdf_get() {
        $filtros = array(
            'fecha_inicio' => $this->get('fecha_inicio', date('Y-m-d')),
            'fecha_fin' => $this->get('fecha_fin', date('Y-m-d')),
            'tipo_movimiento' => $this->get('tipo_movimiento', 'RECARGA'),
            'tag_id' => $this->get('tag_id'),
            'numero_economico_id' => $this->get('numero_economico_id')
        );
        
        // Obtener movimientos
        $movimientos = $this->tags_movimientos_model->get_movimientos_by_filtros($filtros);
        
        if (empty($movimientos)) {
            $this->response(['message' => 'No hay datos para exportar', 'error' => true], RestController::HTTP_OK);
            return;
        }
        
        try {
            require_once APPPATH . '../vendor/autoload.php';
            
            $mpdf = new \Mpdf\Mpdf([
                'format' => 'A4-L',
                'margin_left' => 10,
                'margin_right' => 10,
                'margin_top' => 15,
                'margin_bottom' => 15
            ]);
            
            $mpdf->SetTitle('Reporte de Recargas');
            
            // Preparar datos
            $data = [
                'movimientos' => $movimientos,
                'filtros' => $filtros,
                'total_monto' => array_sum(array_column($movimientos, 'monto')),
                'fecha_generacion' => date('Y-m-d H:i:s'),
                'base_url' => base_url()
            ];
            
            // Cargar vista
            $html = $this->load->view('tags/reporte_recargas_pdf', $data, TRUE);
            
            $mpdf->WriteHTML($html);
            
            // Generar archivo
            $filename = 'reporte_recargas_' . date('YmdHis') . '.pdf';
            $mpdf->Output($filename, \Mpdf\Output\Destination::INLINE);
            
        } catch (\Exception $e) {
            log_message('error', 'Error al generar PDF: ' . $e->getMessage());
            $this->response(['message' => 'Error al generar el PDF: ' . $e->getMessage(), 'error' => true], RestController::HTTP_INTERNAL_ERROR);
        }
    }

    public function exportar_historico_recargas_get($tag_id) {
        if (!$tag_id) {
            $this->response(['message' => 'ID de TAG no proporcionado', 'error' => true], RestController::HTTP_BAD_REQUEST);
            return;
        }
        
        try {
            // Obtener información del TAG
            $tag_info = $this->tags_model->get_tag_by_id($tag_id);
            
            if (!$tag_info) {
                $this->response(['message' => 'TAG no encontrado', 'error' => true], RestController::HTTP_NOT_FOUND);
                return;
            }
            
            // Obtener histórico de recargas
            $recargas = $this->tags_movimientos_model->get_movimientos_by_filtros([
                'tag_id' => $tag_id,
                'tipo_movimiento' => 'RECARGA'
            ]);
            
            require_once APPPATH . '../vendor/autoload.php';
            
            $mpdf = new \Mpdf\Mpdf([
                'format' => 'A4',
                'margin_left' => 10,
                'margin_right' => 10,
                'margin_top' => 15,
                'margin_bottom' => 15
            ]);
            
            // Preparar datos para la vista
            $data = [
                'tag_info' => $tag_info,
                'recargas' => $recargas,
                'fecha_generacion' => date('Y-m-d H:i:s'),
                'base_url' => base_url()
            ];
            
            $mpdf->SetTitle('Histórico de Recargas - TAG ' . $tag_info['numero_tag']);
            $html = $this->load->view('tags/historico_recargas_pdf', $data, TRUE);
            $mpdf->WriteHTML($html);
            
            // Generar y mostrar PDF
            $filename = 'historico_recargas_tag_' . $tag_info['numero_tag'] . '_' . date('YmdHis') . '.pdf';
            $mpdf->Output($filename, \Mpdf\Output\Destination::INLINE);
            
        } catch (\Exception $e) {
            log_message('error', 'Error al generar PDF de histórico: ' . $e->getMessage());
            $this->response(['message' => 'Error al generar el PDF: ' . $e->getMessage(), 'error' => true], RestController::HTTP_INTERNAL_ERROR);
        }
    }
        
    private function _generar_ticket_recarga($data) {
        try {
            require_once APPPATH . '../vendor/autoload.php';
            
            // Configuración para tickets térmicos
            $mpdf = new \Mpdf\Mpdf([
                'format' => [80, 150],
                'margin_left' => 5,
                'margin_right' => 5,
                'margin_top' => 5,
                'margin_bottom' => 5
            ]);
            
            // Cargar vista del ticket
            $html = $this->load->view('tags/ticket_recarga', $data, TRUE);
            
            $mpdf->WriteHTML($html);
            
            // Generar y mostrar PDF
            $filename = 'recarga_' . $data['recarga']['id'] . '_' . date('YmdHis') . '.pdf';
            $mpdf->Output($filename, \Mpdf\Output\Destination::INLINE);
            
        } catch (\Exception $e) {
            log_message('error', 'Error al generar ticket: ' . $e->getMessage());
            $this->response(['message' => 'Error al generar el ticket: ' . $e->getMessage(), 'error' => true], RestController::HTTP_INTERNAL_ERROR);
        }
    }
}