<?php

declare(strict_types=1);

namespace App\Requests;

use App\Models\Post;

/**
 * Classe simple responsable de la validation / sanitation des données
 * provenant des formulaires de post.
 *
 * Usage : $valid = PostRequest::fromArray($data)->validated();
 */
final class PostRequest
{
    private string $title;
    private string $content;

    private function __construct(string $title, string $content)
    {
        $this->title = $title;
        $this->content = $content;
    }

    /**
     * Crée une instance à partir d'un tableau (ex: $request->getParsedBody()).
     *
     * @param mixed $input
     * @return self
     */
    public static function fromArray($input): self
    {
        $title = isset($input['title']) ? (string)$input['title'] : '';
        $content = isset($input['content']) ? (string)$input['content'] : '';

        $title = trim($title);
        $content = trim($content);

        // Limites raisonnables (configurable si besoin)
        $title = mb_substr($title, 0, 255);
        $content = mb_substr($content, 0, 65535);

        return new self($title, $content);
    }

    /**
     * Retourne les données validées/sanitizées prêtes à persister.
     *
     * @return array{title:string,content:string}
     */
    public function validated(): array
    {
        // Ici on pourrait ajouter des validations plus strictes (ex: required, longueur minimale)
        return [
            'title' => $this->title,
            'content' => $this->content,
        ];
    }

    /**
     * Indique si le formulaire est suffisamment rempli.
     *
     * @return bool
     */
    public function isValid(): bool
    {
        return $this->title !== '' && $this->content !== '';
    }

    /**
     * Convertit la requête validée en modèle App\Models\Post.
     *
     * Ce helper facilite la construction d'un Post directement depuis la requête.
     *
     * @param int $id Identifiant (0 si nouvel enregistrement)
     * @return Post
     */
    public function toModel(int $id = 0): Post
    {
        return new Post($id, $this->title, $this->content);
    }
}
