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

class Tags_movimientos_model extends CI_Model {
    
    public function __construct() {
        parent::__construct();
        $this->load->database();
        $this->table = 'tags_movimientos';
    }
    
    public function get_all_movimientos() {
        $this->db->select('tm.*, t.numero_tag')
             ->from($this->table . ' tm')
             ->join('tags t', 't.id = tm.tag_id', 'inner');
        
        $query = $this->db->get();
        log_message('debug', 'SQL simple: ' . $this->db->last_query());
        
        return $query->result_array();
    }
    
    public function get_movimientos_by_filtros($filtros) {
        // Log para depuración
        log_message('debug', 'Filtros recibidos en get_movimientos_by_filtros: ' . json_encode($filtros));
        
        $this->db->select('tm.*, t.numero_tag, ne.numero_economico, ne.modalidad_nombre')
             ->from($this->table . ' tm')
             ->join('tags t', 't.id = tm.tag_id', 'inner')
             ->join('tags_numeros_economicos tne', 'tne.tag_id = t.id', 'left')
             ->join('numeros_economicos ne', 'ne.id = tne.numero_economico_id', 'left');
        
        // Aplicar filtros de fecha
        if (isset($filtros['fecha_inicio']) && !empty($filtros['fecha_inicio'])) {
            $fecha_inicio = date('Y-m-d', strtotime($filtros['fecha_inicio']));
            $this->db->where('DATE(tm.created_at) >=', $fecha_inicio);
            log_message('debug', 'Aplicando filtro fecha_inicio: ' . $fecha_inicio);
        }
        
        if (isset($filtros['fecha_fin']) && !empty($filtros['fecha_fin'])) {
            $fecha_fin = date('Y-m-d', strtotime($filtros['fecha_fin']));
            $this->db->where('DATE(tm.created_at) <=', $fecha_fin);
            log_message('debug', 'Aplicando filtro fecha_fin: ' . $fecha_fin);
        }
        
        // Aplicar filtro de tipo de movimiento
        if (isset($filtros['tipo_movimiento']) && !empty($filtros['tipo_movimiento'])) {
            $this->db->where('tm.tipo_movimiento', $filtros['tipo_movimiento']);
            log_message('debug', 'Aplicando filtro tipo_movimiento: ' . $filtros['tipo_movimiento']);
        }
        
        // Aplicar otros filtros si existen
        if (isset($filtros['tag_id']) && !empty($filtros['tag_id'])) {
            $this->db->where('tm.tag_id', $filtros['tag_id']);
            log_message('debug', 'Aplicando filtro tag_id: ' . $filtros['tag_id']);
        }
        
        if (isset($filtros['numero_economico_id']) && !empty($filtros['numero_economico_id'])) {
            $this->db->where('tne.numero_economico_id', $filtros['numero_economico_id']);
            log_message('debug', 'Aplicando filtro numero_economico_id: ' . $filtros['numero_economico_id']);
        }
        
        $this->db->order_by('tm.created_at', 'DESC');
        
        // Obtener y registrar la consulta SQL generada
        $sql = $this->db->get_compiled_select('', false);
        log_message('debug', 'SQL generado en get_movimientos_by_filtros: ' . $sql);
        
        $query = $this->db->get();
        $result = $query->result_array();
        
        // Registrar el número de resultados obtenidos
        log_message('debug', 'Número de resultados obtenidos: ' . count($result));
        
        return $result;
    }

    public function get_recarga_by_id($id) {
        $this->db->select('tm.*, t.numero_tag, ne.numero_economico, nem.modalidad_nombre, nem.codigo')
                 ->from($this->table . ' tm')
                 ->join('tags t', 't.id = tm.tag_id', 'inner')
                 ->join('tags_numeros_economicos tne', 'tne.tag_id = t.id AND tne.status = 1', 'left')
                 ->join('numeros_economicos ne', 'ne.id = tne.numero_economico_id', 'left')
                 ->join('numeros_economicos_modalidades nem', 'ne.numero_economico_modalidad_id = nem.id', 'left')
                 ->where('tm.id', $id);
        
        $query = $this->db->get();
        
        if ($query->num_rows() > 0) {
            return $query->row_array();
        }
        
        return NULL;
    }
    
    public function verificar_existencia_datos() {
        $this->db->select('COUNT(*) as total')
                 ->from($this->table);
        
        $query = $this->db->get();
        $result = $query->row_array();
        
        return $result['total'] > 0;
    }
    
    // Insertar movimiento de recarga
    public function insertar_recarga($data) {
        $this->db->trans_begin();
        
        // 1. Obtener el saldo actual del TAG
        $this->db->select('saldo')
                 ->from('tags')
                 ->where('id', $data['tag_id']);
        
        $query = $this->db->get();
        $tag = $query->row_array();
        
        if (!$tag) {
            $this->db->trans_rollback();
            return false;
        }
        
        $saldo_anterior = $tag['saldo'];
        $saldo_nuevo = $saldo_anterior + $data['monto'];
        
        // 2. Actualizar el saldo del TAG
        $this->db->where('id', $data['tag_id'])
                 ->update('tags', [
                     'saldo' => $saldo_nuevo,
                     'updated_at' => date('Y-m-d H:i:s')
                 ]);
        
        // 3. Registrar el movimiento
        $movimiento = [
            'tag_id' => $data['tag_id'],
            'tipo_movimiento' => 'RECARGA',
            'monto' => $data['monto'],
            'saldo_anterior' => $saldo_anterior,
            'saldo_nuevo' => $saldo_nuevo,
            'referencia' => 'RC-' . date('YmdHis'),
            'comentario' => $data['comentario'] ?? 'Recarga de saldo',
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s')
        ];
        
        $this->db->insert($this->table, $movimiento);
        $id = $this->db->insert_id();
        
        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
            return false;
        }
        
        $this->db->trans_commit();
        return $id;
    }
    
    public function get_last_recharge_by_tag_id($tag_id) {
        // Obtenemos toda la información del último movimiento, no solo el ID
        $this->db->select('*')
                 ->from($this->table)
                 ->where('tag_id', $tag_id)
                 ->where('tipo_movimiento', 'RECARGA')
                 ->order_by('created_at', 'DESC')
                 ->limit(1);
        
        $query = $this->db->get();
        
        if ($query->num_rows() > 0) {
            return $query->row_array();
        }
        
        return NULL;
    }
}