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

class CajaChica_model extends CI_Model {

    public function listar() {
        return $this->db
            ->select('
                c.*,
                m.abreviado as moneda_abreviado,
                CONCAT(IFNULL(e.apellidos,"")," ",IFNULL(e.nombres,"")) as responsable_nombre,
                est.nombre as estado_nombre,
                est.codigo as estado_codigo
            ')
            ->from('fn_caja_chica c')
            ->join('mt_moneda m',    'm.id = c.moneda_id', 'left')
            ->join('rh_empleado e',  'e.id = c.responsable_id', 'left')
            ->join('estado est',     'est.id = c.estado_id', 'left')
            ->order_by('c.id', 'DESC')
            ->get()
            ->result();
    }

    public function obtener_completo($id) {
        return $this->db
            ->select('
                c.*,
                m.abreviado as moneda_abreviado,
                m.nombre as moneda_nombre,
                CONCAT(IFNULL(e.apellidos,"")," ",IFNULL(e.nombres,"")) as responsable_nombre,
                est.nombre as estado_nombre,
                est.codigo as estado_codigo
            ')
            ->from('fn_caja_chica c')
            ->join('mt_moneda m',    'm.id = c.moneda_id', 'left')
            ->join('rh_empleado e',  'e.id = c.responsable_id', 'left')
            ->join('estado est',     'est.id = c.estado_id', 'left')
            ->where('c.id', $id)
            ->get()
            ->row();
    }

    public function obtener_caja_abierta() {
        return $this->db
            ->select('c.*')
            ->from('fn_caja_chica c')
            ->join('estado est', 'est.id = c.estado_id')
            ->where('est.tipo', 'CAJA_CHICA')
            ->where('est.codigo', 'ABT')
            ->get()
            ->row();
    }

    public function obtener_ultima_caja() {
        return $this->db
            ->order_by('id', 'DESC')
            ->limit(1)
            ->get('fn_caja_chica')
            ->row();
    }

    public function insertar_caja($data) {
        $this->db->insert('fn_caja_chica', $data);
        return $this->db->insert_id();
    }

    public function actualizar_caja($id, $data) {
        return $this->db
            ->where('id', $id)
            ->update('fn_caja_chica', $data);
    }

    public function actualizar_saldo($id, $nuevoSaldo) {
        return $this->db
            ->where('id', $id)
            ->update('fn_caja_chica', [
                'monto_actual' => $nuevoSaldo,
                'updated_at'   => date('Y-m-d H:i:s'),
                'updated_by'   => $this->session->userdata('id'),
            ]);
    }

    public function listar_movimientos($caja_id) {
        return $this->db
            ->select('
                m.*,
                mo.abreviado as moneda_abreviado,
                b.nombre as banco_nombre,
                bc.numero_cuenta,
                u.usuario as usuario_nombre
            ')
            ->from('fn_movimiento m')
            ->join('mt_moneda mo',        'mo.id = m.moneda_id', 'left')
            ->join('mt_banco_cuenta bc',  'bc.id = m.banco_cuenta_id', 'left')
            ->join('mt_banco b',          'b.id = bc.banco_id', 'left')
            ->join('usuarios u',          'u.id = m.created_by', 'left')
            ->where('m.caja_id', $caja_id)
            ->order_by('m.fecha', 'ASC')
            ->order_by('m.id', 'ASC')
            ->get()
            ->result();
    }

    public function insertar_movimiento($data) {
        $this->db->insert('fn_movimiento', $data);
        return $this->db->insert_id();
    }

    public function obtener_resumen($caja_id) {
        // Total ingresos
        $ingresos = $this->db
            ->select('IFNULL(SUM(monto), 0) as total')
            ->from('fn_movimiento')
            ->where('caja_id', $caja_id)
            ->where('tipo', 'I')
            ->get()->row();

        // Total egresos
        $egresos = $this->db
            ->select('IFNULL(SUM(monto), 0) as total')
            ->from('fn_movimiento')
            ->where('caja_id', $caja_id)
            ->where('tipo', 'E')
            ->get()->row();

        // Egresos con comprobante
        $egresosConComp = $this->db
            ->select('IFNULL(SUM(monto), 0) as total')
            ->from('fn_movimiento')
            ->where('caja_id', $caja_id)
            ->where('tipo', 'E')
            ->where('tiene_comprobante', 1)
            ->get()->row();

        // Egresos sin comprobante
        $egresosSinComp = $this->db
            ->select('IFNULL(SUM(monto), 0) as total')
            ->from('fn_movimiento')
            ->where('caja_id', $caja_id)
            ->where('tipo', 'E')
            ->where('tiene_comprobante', 0)
            ->get()->row();

        return (object)[
            'total_ingresos'         => (float)$ingresos->total,
            'total_egresos'          => (float)$egresos->total,
            'total_egresos_con_comp' => (float)$egresosConComp->total,
            'total_egresos_sin_comp' => (float)$egresosSinComp->total,
        ];
    }

    public function obtener_estado($tipo, $codigo) {
        return $this->db
            ->where('tipo', $tipo)
            ->where('codigo', $codigo)
            ->where('estado', 1)
            ->get('estado')
            ->row();
    }

    public function listar_monedas() {
        return $this->db
            ->where('estado', 1)
            ->order_by('nombre', 'ASC')
            ->get('mt_moneda')
            ->result();
    }

    public function listar_responsables() {
        return $this->db
            ->select('id, CONCAT(apellidos," ",nombres) as nombre_completo')
            ->where('estado', 1)
            ->order_by('apellidos', 'ASC')
            ->get('rh_empleado')
            ->result();
    }

    public function listar_bancos_cuentas() {
        return $this->db
            ->select('bc.*, b.nombre as banco_nombre, m.abreviado as moneda_abreviado')
            ->from('mt_banco_cuenta bc')
            ->join('mt_banco b',  'b.id = bc.banco_id')
            ->join('mt_moneda m', 'm.id = bc.moneda_id')
            ->where('bc.estado', 1)
            ->order_by('b.nombre', 'ASC')
            ->get()
            ->result();
    }
}