<?php
namespace App\Controllers;

use App\Core\Auth;
use App\Core\Controller;
use App\Core\Csrf;
use App\Core\Permission;
use App\Models\MemberProfile;
use App\Models\StudentMusicLevel;
use App\Models\EnrollmentRequest;

final class MemberController extends Controller
{
    public function show(): void
    {
        Auth::requireLogin();
        Permission::require('membres.view');

        $id=(int)($_GET['id'] ?? 0);
        $member=MemberProfile::find($id);

        if(!$member){
            http_response_code(404);
            exit('Membre introuvable.');
        }
        if (!\App\Core\Permission::canAccessClient((int)($member['client_id'] ?? 0))) {
            http_response_code(403);
            exit('Ce membre ne fait pas partie de votre dossier familial.');
        }

        $this->view('members/show',[
            'pageTitle'=>'Fiche membre',
            'member'=>$member,
            'documents'=>MemberProfile::documents($id),
            'requests'=>MemberProfile::requests($id),
            'musicLevels'=>StudentMusicLevel::history($member['source_table'],$id,(int)(Auth::user()['organisation_id']??1)),
            'musicLevelReferences'=>StudentMusicLevel::references(),
            'musicInstruments'=>StudentMusicLevel::instruments((int)(Auth::user()['organisation_id']??1)),
            'currentSchoolYear'=>StudentMusicLevel::currentYear((int)(Auth::user()['organisation_id']??1)),
            'annualFile'=>EnrollmentRequest::activeAnnualFile((int)(Auth::user()['organisation_id']??1),(int)($member['client_id']??0)),
        ]);
    }

    public function edit(): void
    {
        Auth::requireLogin();
        if (\App\Core\Permission::isFamilyPortalIdentity()) {
            http_response_code(403);
            exit('La modification d’un membre doit être demandée à la Direction depuis la messagerie.');
        }
        Permission::require('membres.edit');

        $id=(int)($_GET['id'] ?? 0);
        $member=MemberProfile::find($id);

        if(!$member){
            http_response_code(404);
            exit('Membre introuvable.');
        }

        $this->view('members/edit',[
            'pageTitle'=>'Modifier le membre',
            'member'=>$member,
        ]);
    }

    public function update(): void
    {
        Auth::requireLogin();
        if (\App\Core\Permission::isFamilyPortalIdentity()) {
            http_response_code(403);
            exit('La modification d’un membre doit être demandée à la Direction depuis la messagerie.');
        }
        $isMusicLevel=($_POST['form_action']??'')==='save_music_level';
        if($isMusicLevel){
            if(!Permission::can('membres.edit')&&!Permission::can('presences.mark')){Permission::require('membres.edit');}
        }else{Permission::require('membres.edit');}
        Csrf::verify($_POST['_csrf'] ?? null);

        $id=(int)($_POST['id'] ?? 0);

        if($isMusicLevel){
            $member=MemberProfile::find($id);
            if(!$member){http_response_code(404);exit('Membre introuvable.');}
            try{StudentMusicLevel::save((int)(Auth::user()['organisation_id']??1),$member['source_table'],$id,(int)(Auth::user()['id']??0),$_POST);$_SESSION['success']='Le niveau musical a été enregistré pour l’année.';}catch(\Throwable $e){$_SESSION['error']=$e->getMessage();}
            $this->redirect('/membres/voir?id='.$id);return;
        }

        MemberProfile::update($id,[
            'prenom'=>$_POST['prenom'] ?? '',
            'nom'=>$_POST['nom'] ?? '',
            'date_naissance'=>$_POST['date_naissance'] ?? '',
            'email'=>$_POST['email'] ?? '',
            'telephone'=>$_POST['telephone'] ?? '',
        ]);

        $_SESSION['success']='Le membre a été modifié.';
        $this->redirect('/membres/voir?id='.$id);
    }
}
