<?php
namespace App\Controllers;

use App\Core\Auth;
use App\Core\Controller;
use App\Core\Csrf;
use App\Core\Permission;
use App\Models\FamilyMessage;

final class FamilyMessageController extends Controller
{
    private const TYPES=[
        'ajout_membre'=>'Ajouter un membre à ma famille',
        'correction_fiche'=>'Corriger une information de ma fiche',
        'correction_membre'=>'Corriger la fiche d’un membre',
        'facturation'=>'Question concernant la facturation',
        'coordonnees'=>'Signaler un changement de coordonnées',
        'autre'=>'Autre demande',
    ];

    public function index(): void
    {
        Auth::requireLogin();
        $clientId=$this->familyClientId();
        if ($clientId===null && !Permission::canAny('clients.edit','clients.create','communications.view')) $this->deny();
        $this->view('family_messages/index',[
            'pageTitle'=>'Mes demandes',
            'threads'=>FamilyMessage::threads($this->org(),$clientId),
            'familyPortal'=>$clientId!==null,
        ]);
    }

    public function create(): void
    {
        Auth::requireLogin();
        if ($this->familyClientId()===null) $this->deny();
        $this->view('family_messages/form',['pageTitle'=>'Nouvelle demande','types'=>self::TYPES]);
    }

    public function store(): void
    {
        Auth::requireLogin();
        Csrf::verify($_POST['_csrf']??null);
        $clientId=$this->familyClientId();
        if ($clientId===null) $this->deny();
        $type=(string)($_POST['type_code']??'');
        $subject=trim((string)($_POST['subject']??''));
        $body=trim((string)($_POST['body']??''));
        if (!isset(self::TYPES[$type]) || $subject==='' || mb_strlen($body)<10) {
            $_SESSION['error']='Choisissez un type, indiquez un objet et décrivez précisément votre demande.';
            $this->redirect('/mon-espace/demandes/nouvelle');
        }
        $id=FamilyMessage::create($this->org(),$clientId,(int)Auth::id(),$type,$subject,$body);
        $_SESSION['success']='Votre demande a été transmise à la Direction.';
        $this->redirect('/mon-espace/demandes/voir?id='.$id);
    }

    public function show(): void
    {
        Auth::requireLogin();
        $thread=FamilyMessage::find((int)($_GET['id']??0));
        if (!$thread || (int)$thread['organisation_id']!==$this->org()) { http_response_code(404);exit('Demande introuvable.'); }
        $clientId=$this->familyClientId();
        if ($clientId!==null && (int)$thread['client_id']!==$clientId) $this->deny();
        $direction=$clientId===null;
        if ($direction && !Permission::canAny('clients.edit','clients.create','communications.view')) $this->deny();
        if (!$direction && !Permission::isFamilyPortalIdentity()) $this->deny();
        FamilyMessage::markRead((int)$thread['id'],$direction?'direction':'family');
        $this->view('family_messages/show',[
            'pageTitle'=>'Échange avec la Direction','thread'=>$thread,
            'posts'=>FamilyMessage::posts((int)$thread['id']),'direction'=>$direction,
        ]);
    }

    public function reply(): void
    {
        Auth::requireLogin();
        Csrf::verify($_POST['_csrf']??null);
        $thread=FamilyMessage::find((int)($_POST['id']??0));
        if (!$thread || (int)$thread['organisation_id']!==$this->org()) { http_response_code(404);exit('Demande introuvable.'); }
        $clientId=$this->familyClientId();
        $direction=$clientId===null;
        if ($direction && !Permission::canAny('clients.edit','clients.create','communications.view')) $this->deny();
        if (!$direction && (int)$thread['client_id']!==$clientId) $this->deny();
        $body=trim((string)($_POST['body']??''));
        if (mb_strlen($body)<2) { $_SESSION['error']='Le message est vide.';$this->redirect('/mon-espace/demandes/voir?id='.(int)$thread['id']); }
        $status=$direction ? (string)($_POST['status']??'en_cours') : 'completee';
        if (!in_array($status,['en_cours','complement_requis','completee','fermee'],true)) $status='en_cours';
        FamilyMessage::reply((int)$thread['id'],(int)Auth::id(),$direction?'direction':'family',$body,$status);
        if ($direction && $status==='complement_requis') $this->emailComplement($thread,$body);
        $_SESSION['success']=$direction && $status==='complement_requis'
            ? 'La demande de complément a été enregistrée et le courriel a été tenté.'
            : 'Votre message a été ajouté.';
        $this->redirect('/mon-espace/demandes/voir?id='.(int)$thread['id']);
    }

    private function familyClientId(): ?int
    {
        return Permission::isFamilyPortalIdentity() ? Permission::familyPortalClientId() : null;
    }
    private function org(): int { return (int)(Auth::user()['organisation_id']??1); }
    private function deny(): never { http_response_code(403);exit('Accès refusé.'); }
    private function emailComplement(array $thread,string $message): void
    {
        $email=filter_var((string)($thread['email']??''),FILTER_VALIDATE_EMAIL);
        if (!$email) return;
        $headers="MIME-Version: 1.0\r\nContent-Type: text/html; charset=UTF-8\r\n";
        $body='<h2>Carrefour des Arts</h2><p>La Direction demande un complément pour votre demande « '
            .htmlspecialchars((string)$thread['subject'],ENT_QUOTES,'UTF-8').' ».</p><p>'
            .nl2br(htmlspecialchars($message,ENT_QUOTES,'UTF-8')).'</p>'
            .'<p>Connectez-vous à votre espace Famille pour répondre.</p>';
        @mail($email,'Complément demandé - Carrefour des Arts',$body,$headers);
    }
}
