<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class dashboard_model extends CI_Model {
    public function __construct()
    {
        parent::__construct();
        $this->load->database();
    }

    function get_setting()
    {
        return $this->db->get('settings')->row();
    }

    function get_todays_cases()
    {
        $this->db->where('next_date', date("Y-m-d"));
        $this->db->join('cases C', 'C.id = EC.case_id', 'LEFT');
        return $this->db->get('extended_case EC', 5)->result();
    }

    function get_todays_to_do()
    {
        $this->db->where('date', date("Y-m-d"));
        return $this->db->get('to_do_list', 5)->result();
    }

    function get_case_all()
    {
        $this->db->where('C.is_archived', 0);
        $this->db->select('EC.next_date, C.case_no, C.id case_id, C.title');
        $this->db->join('cases C', 'C.id = EC.case_id', 'LEFT');
        return $this->db->get('extended_case EC')->result();
    }

    function get_clients()
    {
        $this->db->where('user_role', 2);
        return $this->db->get('users')->result();
    }

    function get_notice()
    {
        $this->db->order_by('date_time', 'DESC');
        return $this->db->get('notice')->result();
    }

    function get_appointment_all()
    {
        return $this->db->get('appointments')->result();
    }

    // Próximos agendamentos
    function get_upcoming_appointments($limit = 8)
    {
        $this->db->select('A.*, C.name AS client_nome');
        $this->db->from('appointments A');
        $this->db->join('contacts C', 'C.id = A.contact_id', 'left');
        $this->db->where('DATE(A.date_time) >=', date('Y-m-d'));
        $this->db->order_by('A.date_time', 'ASC');
        $this->db->limit($limit);
        return $this->db->get()->result();
    }

    // Gráfico financeiro - últimos 6 meses
    function get_financeiro_chart()
    {
        $sql = "SELECT 
            DATE_FORMAT(vencimento, '%m/%Y') AS mes_label,
            MONTH(vencimento) AS mes,
            YEAR(vencimento) AS ano,
            SUM(CASE WHEN tipo='receber' AND status='pago' THEN valor ELSE 0 END) AS recebido,
            SUM(CASE WHEN tipo='pagar' AND status='pago' THEN valor ELSE 0 END) AS pago,
            SUM(CASE WHEN tipo='receber' AND status='pendente' THEN valor ELSE 0 END) AS a_receber,
            SUM(CASE WHEN tipo='pagar' AND status='pendente' THEN valor ELSE 0 END) AS a_pagar
            FROM fin_lancamentos
            WHERE vencimento >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
            GROUP BY ano, mes
            ORDER BY ano ASC, mes ASC";
        return $this->db->query($sql)->result();
    }

    // Totais financeiros do mês atual
    function get_financeiro_mes()
    {
        $sql = "SELECT
            SUM(CASE WHEN tipo='receber' AND status='pago' THEN valor ELSE 0 END) AS recebido,
            SUM(CASE WHEN tipo='pagar' AND status='pago' THEN valor ELSE 0 END) AS pago,
            SUM(CASE WHEN tipo='receber' AND status='pendente' THEN valor ELSE 0 END) AS a_receber,
            SUM(CASE WHEN tipo='pagar' AND status='pendente' THEN valor ELSE 0 END) AS a_pagar,
            SUM(CASE WHEN tipo='receber' AND status='pendente' AND vencimento < CURDATE() THEN valor ELSE 0 END) AS vencido
            FROM fin_lancamentos
            WHERE MONTH(vencimento) = MONTH(CURDATE())
            AND YEAR(vencimento) = YEAR(CURDATE())";
        return $this->db->query($sql)->row();
    }

    // Próximas diligências para o dashboard
    function get_proximas_diligencias($limit = 5)
    {
        $this->db->select('d.id, d.titulo, d.tipo, d.data_hora, d.local, d.status, c.case_no');
        $this->db->from('diligencias d');
        $this->db->join('cases c', 'c.id = d.case_id', 'left');
        $this->db->where('d.data_hora >=', date('Y-m-d H:i:s'));
        $this->db->where_in('d.status', ['agendada', 'em_andamento']);
        $this->db->order_by('d.data_hora', 'ASC');
        $this->db->limit($limit);
        return $this->db->get()->result();
    }

    function get_contas_vencidas($limit = 10)
    {
        $sql = "SELECT 
            l.id, l.descricao, l.vencimento AS data_vencimento, l.valor,
            u.name AS client_nome
            FROM fin_lancamentos l
            LEFT JOIN users u ON u.id = l.client_id
            WHERE l.tipo = 'receber'
            AND l.status = 'pendente'
            AND l.vencimento < CURDATE()
            ORDER BY l.vencimento ASC
            LIMIT " . (int)$limit;
        return $this->db->query($sql)->result();
    }
}
