<?php
namespace App\Models;

use CodeIgniter\Model;

class Avance extends Model {
    protected $table = 'avances';
    protected $primaryKey = 'avance_id';

    protected $allowedFields = [
        'avance_amount', 'avance_date','user_id',
        'customer_name', 'customer_address', 'customer_phone', 'customer_cin',
        'gross_amount','amount_due','product_id','is_order','active','store_id',
        'type_avance', 'deadline' // Ajout du champ type et deadline
    ]; 

    public function createAvance(array $data) {
        try {
            // Si la date de création n'est pas définie, on prend aujourd'hui
            if (empty($data['avance_date'])) {
                $data['avance_date'] = date('Y-m-d');
            }

            // Calcul de la deadline en fonction du type
            if (!empty($data['type'])) {
                if (strtolower($data['type']) === 'avance sur terre') {
                    $data['deadline'] = date('Y-m-d', strtotime($data['avance_date'] . ' +15 days'));
                } elseif (strtolower($data['type']) === 'avance sur mer') {
                    $data['deadline'] = date('Y-m-d', strtotime($data['avance_date'] . ' +2 months'));
                }
            }

            return $this->insert($data);
        } catch (\Exception $e) {
            log_message('error', 'Erreur lors de l\'ajout de l\'avance : ' . $e->getMessage());
            return false;
        }  
    }

    public function updateAvance(int $id, array $data) {
        if ($id <= 0) {
            log_message('error', 'ID invalide pour la mise à jour du recouvrement : ' . $id);
            return false;
        }
        try {
            // Recalcul de la deadline si le type change
            if (!empty($data['type']) && !empty($data['avance_date'])) {
                if (strtolower($data['type']) === 'avance sur terre') {
                    $data['deadline'] = date('Y-m-d', strtotime($data['avance_date'] . ' +15 days'));
                } elseif (strtolower($data['type']) === 'avance sur mer') {
                    $data['deadline'] = date('Y-m-d', strtotime($data['avance_date'] . ' +2 months'));
                }
            }
            return $this->update($id, $data);
        } catch (\Exception $e) {
            log_message('error', 'Erreur lors de la mise à jour de l\'avance : ' . $e->getMessage());
            return false; 
        }
    }

    // 📌 Le reste de tes fonctions restent inchangées
    public function getAllAvanceData(int $id=null) {
        $session = session();
        $users =  $session->get('user');
        $isAdmin = in_array($users['group_name'], ['Conseil', 'Direction']);
        if($isAdmin) {
            if($id){
                try {
                    return $this->where('user_id',$id)
                        ->where('is_order',0)
                        ->where('active',1)
                        ->orderBy('avance_date', 'DESC') 
                        ->findAll();
                } catch (\Exception $e) {
                    log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage());
                    return false;
                }
            }
            try {
                return $this
                    ->where('is_order',0)
                    ->where('active',1)
                    ->orderBy('avance_date', 'DESC')
                    ->findAll();
            } catch (\Exception $e) {
                log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage());
                return false;
            }
        } else {
            if($id){
                try {
                    return $this->where('user_id',$id)
                        ->where('is_order',0)
                        ->where('active',1)
                        ->where('store_id',$users['store_id'])
                        ->orderBy('avance_date', 'DESC') 
                        ->findAll();
                } catch (\Exception $e) {
                    log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage());
                    return false;
                }
            }
            try {
                return $this
                    ->where('is_order',0)
                    ->where('active',1)
                    ->where('store_id',$users['store_id'])
                    ->orderBy('avance_date', 'DESC')
                    ->findAll();
            } catch (\Exception $e) {
                log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage());
                return false;
            }
        }
    }

    public function fetchSingleAvance(int $avance_id){
        return $this->where('avance_id',$avance_id)->first();
    }

    public function removeAvance(int $avance_id){
        return $this->delete($avance_id);
    }

    public function getTotalAvance() {
        $session = session();
        $users =  $session->get('user');
        $isAdmin = in_array($users['group_name'], ['Conseil', 'Direction']);
        if($isAdmin) {
            try {
                return $this->select('SUM(avance_amount) AS ta')
                    ->where('is_order', 0)
                    ->get()
                    ->getRowObject();
            } catch (\Exception $e) {
                log_message('error', 'Erreur lors du total du montant des avances : ' . $e->getMessage());
                return false;
            }
        } else {
            try {
                return $this->select('SUM(avance_amount) AS ta')
                    ->where('is_order', 0)
                    ->where('store_id',$users['store_id'])
                    ->get()
                    ->getRowObject();
            } catch (\Exception $e) {
                log_message('error', 'Erreur lors du total du montant des avances : ' . $e->getMessage());
                return false;
            }
        }
    }

    public function getAllAvanceData1(int $id=null) {
        $session = session();
        $users =  $session->get('user');
        $isAdmin = in_array($users['group_name'], ['Conseil', 'Direction']);
        if($isAdmin) {
            if($id){
                try {
                    return $this->where('user_id',$id)
                        ->where('is_order',1)
                        ->where('active',1)
                        ->orderBy('avance_date', 'DESC') 
                        ->findAll();
                } catch (\Exception $e) {
                    log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage());
                    return false;
                }
            }
            try {
                return $this
                    ->where('is_order',1)
                    ->where('active',1)
                    ->orderBy('avance_date', 'DESC')
                    ->findAll();
            } catch (\Exception $e) {
                log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage());
                return false;
            }
        } else {
            if($id){
                try {
                    return $this->where('user_id',$id)
                        ->where('is_order',1)
                        ->where('active',1)
                        ->where('store_id',$users['store_id'])
                        ->orderBy('avance_date', 'DESC') 
                        ->findAll();
                } catch (\Exception $e) {
                    log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage());
                    return false;
                }
            }
            try {
                return $this
                    ->where('is_order',0)
                    ->orderBy('avance_date', 'DESC')
                    ->findAll();
            } catch (\Exception $e) {
                log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage());
                return false;
            }
        }
    }

    public function getAllAvanceData2(int $id=null) {
        $session = session();
        $users =  $session->get('user');
        $isAdmin = in_array($users['group_name'], ['Conseil', 'Direction']);
        if($isAdmin) {
            if($id){
                try {
                    return $this->where('user_id',$id)
                        ->where('is_order',0)
                        ->where('active',0)
                        ->orderBy('avance_date', 'DESC') 
                        ->findAll();
                } catch (\Exception $e) {
                    log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage());
                    return false;
                }
            }
            try {
                return $this
                    ->where('is_order',0)
                    ->where('active',0)
                    ->orderBy('avance_date', 'DESC')
                    ->findAll();
            } catch (\Exception $e) {
                log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage());
                return false;
            }
        } else {
            if($id){
                try {
                    return $this->where('user_id',$id)
                        ->where('is_order',0)
                        ->where('active',0)
                        ->where('store_id',$users['store_id'])
                        ->orderBy('avance_date', 'DESC') 
                        ->findAll();
                } catch (\Exception $e) {
                    log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage());
                    return false;
                }
            }
            try {
                return $this
                    ->where('is_order',0)
                    ->where('active',0)
                    ->where('store_id',$users['store_id'])
                    ->orderBy('avance_date', 'DESC')
                    ->findAll();
            } catch (\Exception $e) {
                log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage());
                return false;
            }
        }
    }

    public function checkExpiredAvance() {
        $now = date('Y-m-d');
        $avances = $this->where('active', '1')
            ->where('deadline <', $now)
            ->findAll();

        if (!empty($avances)) {
            $productModel = new Products();

            foreach ($avances as $avance) {
                $this->update($avance['avance_id'], ['active' => '0']);
                $productModel->update($avance['product_id'], ['product_sold' => 0]);
            }
        }
    }
    /**
 * Récupérer les avances qui arrivent à échéance dans X jours
 */
public function getAvancesNearDeadline($days = 3)
{
    $alertDate = date('Y-m-d', strtotime("+{$days} days"));
    
    return $this->select('avances.*, users.store_id')
                ->join('users', 'users.id = avances.user_id')
                ->where('avances.is_order', 0)
                ->where('avances.active', 1)
                ->where('avances.amount_due >', 0)
                ->where('DATE(avances.deadline)', $alertDate)
                ->findAll();
}
}

