<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;


class Dossier extends Model
{
    //use HasFactory;

    protected $table = 'dossiers';

    // Champs autorisés à l’insertion (mass assignment)
    protected $fillable = [
        'numero_dossier',
        'nom',
        'nom_jeune',
        'prenom',
        'profession',
        'document_id',
        'date_naissance',
        'lieu_naissance',
        'adresse',
        'taille',
        'yeux',
        'sexe',
        'classe',
        'photo',
        'document',
        'signature',
        'pere',
        'mere',

        // Permis - Étape 1
        'permis_code_obtention_date',
        'permis_code_fiche_pdf',
        'user_delivered_code',

        // Permis - Étape 2
        'permis_crenaux',
        'permis_crenaux_obtention_date',
        'permis_crenaux_fiche_pdf',
        'user_delivered_crenaux',

        // Permis - Étape 3
        'permis_conduite',
        'permis_conduite_obtention_date',
        'permis_conduite_fiche_pdf',
        'user_delivered_conduite',

        // Permis provisoire - Étape 4
        'provisoire_date_delivrance',
        'provisoire_date_valide',
        'provisoire_date_expire',
        'user_delivered_provisoire',

        // Permis définitif - Étape 5
        'permis_date_delivrance',
        'permis_date_valide',
        'permis_date_expire',
        'user_delivered_definitif',

        // Renouvellement - Étape 6
        'renouvellement_permis_date_delivrance',
        'renouvellement_permis_date_valide',
        'renouvellement_permis_date_expire',
        'user_renouvellement_delivered',
    ];


    protected $casts = [
        'permis_crenaux' => 'boolean',
        'permis_conduite' => 'boolean',
    ];

    // Génère automatiquement un code unique de 6 caractères lors de la création
    // 02 milliards de combinaisons possibles
    protected static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            do {
                $code = strtoupper(substr(base_convert(sha1(Str::uuid()), 16, 36), 0, 6));
            } while (self::where('numero_dossier', $code)->exists());

            $model->numero_dossier = $code;
        });
    }

    // 🔁 Un dossier peut avoir plusieurs sessions d'examen
    public function sessions()
    {
        return $this->hasMany(SessionExamen::class, 'dossier_id');
    }

     // 🔁 Relations avec les agents utilisateurs
     public function agentCode()
     {
         return $this->belongsTo(User::class, 'user_delivered_code');
     }
 
     public function agentCrenaux()
     {
         return $this->belongsTo(User::class, 'user_delivered_crenaux');
     }
 
     public function agentConduite()
     {
         return $this->belongsTo(User::class, 'user_delivered_conduite');
     }
 
     public function agentProvisoire()
     {
         return $this->belongsTo(User::class, 'user_delivered_provisoire');
     }
 
     public function agentDefinitif()
     {
         return $this->belongsTo(User::class, 'user_delivered_definitif');
     }

     public function agentRenouvellement()
     {
         return $this->belongsTo(User::class, 'user_renouvellement_delivered');
     }
    
}
