<?php 
namespace App\Models;

use CodeIgniter\Model;

class SortieCaisse extends Model
{
    protected $table = 'sortie_caisse';
    protected $primaryKey = 'id_sortie';

    protected $allowedFields = [
        'montant_retire',
        'date_retrait',
        'motif',
        'commentaire',
        'fournisseur',
        'nif_cin',
        'statistique',
        'telephone',
        'code_postal',
        'preuve_achat',
        'sortie_personnel',
        'source_fond',
        'initiateur_demande',
        'statut',
        'user_id',
        'store_id',
        'mime_type',
        'admin_raison',
        'nom_demandeur',
        'fonction_demandeur',
        'mode_paiement',
        'montant_lettre',
        'date_demande',
        'reference',
        'date_paiement_effectif',
        'numero_fiche',
        'date_fiche',
        'service_demandeur',
        'objet_depense',
        'nature_depense',
        'montant_estime',
        'mode_reglement',
        'date_paiement_prevue',
        'justificatifs',
        'visa_demandeur',
        'date_visa_demandeur',
        'visa_chef_service',
        'date_visa_chef_service',
        'visa_direction',
        'date_visa_direction',
        'visa_conseil',
        'date_visa_conseil',
        'observations'
    ];

    /**
     * ✅ MODIFICATION : DAF, Direction, SuperAdmin voient TOUS les stores
     * Caissière voit uniquement SES décaissements
     */
    public function getAllSortieCaisse()
    {
        try {
            $session = session();
            $users   = $session->get('user');
            
            // ✅ DAF, Direction, SuperAdmin : Voir TOUS les stores
            if (in_array($users['group_name'], ['Direction', 'DAF', 'SuperAdmin'])) {
                return $this
                    ->select('*')
                    ->orderBy('date_retrait', 'DESC')
                    ->findAll();
            }
            
            // ✅ CAISSIÈRE : Voir TOUS les décaissements de SON STORE (pas seulement les siens)
            if($users["group_name"] === "Caissière"){
                return $this
                    ->select('*')
                    ->where('store_id', $users['store_id'])  // ✅ CHANGEMENT ICI
                    ->orderBy('date_retrait', 'DESC') 
                    ->findAll();
            }
            
            // ✅ AUTRES : Par défaut, voir uniquement leurs décaissements
            return $this
                ->select('*')
                ->where('user_id', $users['id'])
                ->orderBy('date_retrait', 'DESC') 
                ->findAll();
        } catch (\Exception $e) {
            log_message('error', 'Erreur lors de la récupération des sorties caisse : ' . $e->getMessage());
            return [];
        }
    }

    /**
     * ✅ MODIFICATION : Même logique pour les décaissements filtrés
     */
    public function getAllSortieCaisse1()
    {
        try {
            $session = session();
            $users   = $session->get('user');
            
            // ✅ DAF, Direction, SuperAdmin : Voir TOUS les stores
            if (in_array($users['group_name'], ['Direction', 'DAF', 'SuperAdmin'])) {
                return $this
                    ->select('*')
                    ->join('user_group', 'user_group.user_id = sortie_caisse.user_id')
                    ->where('user_group.group_id', 7)
                    ->orderBy('date_retrait', 'DESC')
                    ->findAll();
            }
            
            // ✅ CAISSIÈRE : Voir TOUS les décaissements de SON STORE
            if($users["group_name"] === "Caissière"){
                return $this
                    ->select('*')
                    ->where('store_id', $users['store_id'])  // ✅ CHANGEMENT ICI
                    ->orderBy('date_retrait', 'DESC') 
                    ->findAll();
            }
            
            return $this
                ->select('*')
                ->where('user_id', $users['id'])
                ->orderBy('date_retrait', 'DESC') 
                ->findAll();
        } catch (\Exception $e) {
            log_message('error', 'Erreur lors de la récupération des sorties caisse : ' . $e->getMessage());
            return [];
        }
    }

    public function addSortieCaisse(array $data) {
        try {
            return $this->insert($data);
        } catch (\Exception $e) {
            log_message('error', 'Erreur lors de l\'ajout de la sortie : ' . $e->getMessage());
            return false;
        }  
    }

    public function updateSortieCaisse(int $id, array $data) {
        if ($id <= 0) {
            log_message('error', 'ID invalide pour la mise à jour de la sortie caisse : ' . $id);
            return false;
        }
    
        try {
            return $this->update($id, $data);
        } catch (\Exception $e) {
            log_message('error', 'Erreur lors de la mise à jour du recouvrement : ' . $e->getMessage());
            return false; 
        }
    }
    
    public function getSortieCaisseSingle(int $id)
    {
        $reparation = $this->select('*')
            ->where('id_sortie', $id)
            ->first();
        return $reparation;
    }
    /**
     * ✅ MODIFICATION : DAF, Direction, SuperAdmin voient TOUS les totaux
     */
    public function getTotalSortieCaisse() {
        $session = session();
        $users = $session->get('user');
        
        // ✅ DAF, Direction, SuperAdmin : Voir TOUS les stores
        $isAdmin = in_array($users['group_name'], ['Direction', 'DAF', 'SuperAdmin']);
        
        if ($isAdmin) {
            try {
                return $this->select('
                    SUM(CASE WHEN mode_paiement = "En espèce" AND statut = "Payé" THEN montant_retire ELSE 0 END) AS total_espece,
                    SUM(CASE WHEN mode_paiement = "MVOLA" AND statut = "Payé" THEN montant_retire ELSE 0 END) AS total_mvola,
                    SUM(CASE WHEN mode_paiement = "Virement Bancaire" AND statut = "Payé" THEN montant_retire ELSE 0 END) AS total_virement,
                    SUM(CASE WHEN statut = "Payé" THEN montant_retire ELSE 0 END) AS mr
                ')
                // ✅ CHANGEMENT : Uniquement statut = "Payé" (plus "Valider")
                ->where('statut', 'Payé')
                ->get()
                ->getRowObject();
            } catch (\Exception $e) {
                log_message('error', 'Erreur getTotalSortieCaisse (Admin) : ' . $e->getMessage());
                return (object)[
                    'total_espece' => 0,
                    'total_mvola' => 0,
                    'total_virement' => 0,
                    'mr' => 0
                ];
            }
        } else {
            // ✅ CAISSIÈRE : Uniquement son store ET statut "Payé"
            try {
                return $this->select('
                    SUM(CASE WHEN mode_paiement = "En espèce" AND statut = "Payé" THEN montant_retire ELSE 0 END) AS total_espece,
                    SUM(CASE WHEN mode_paiement = "MVOLA" AND statut = "Payé" THEN montant_retire ELSE 0 END) AS total_mvola,
                    SUM(CASE WHEN mode_paiement = "Virement Bancaire" AND statut = "Payé" THEN montant_retire ELSE 0 END) AS total_virement,
                    SUM(CASE WHEN statut = "Payé" THEN montant_retire ELSE 0 END) AS mr
                ')
                ->where('store_id', $users['store_id'])
                // ✅ CHANGEMENT : Uniquement statut = "Payé" (plus "Valider")
                ->where('statut', 'Payé')
                ->get()
                ->getRowObject();
            } catch (\Exception $e) {
                log_message('error', 'Erreur getTotalSortieCaisse (Store) : ' . $e->getMessage());
                return (object)[
                    'total_espece' => 0,
                    'total_mvola' => 0,
                    'total_virement' => 0,
                    'mr' => 0
                ];
            }
        }
    }
}