<?php

declare(strict_types=1);

namespace App\Module\Commercial\Application\Service;

/**
 * Normalisation serveur des champs texte d'un Client / ClientContact, appliquee
 * par le ClientProcessor (et plus tard le ClientContactProcessor) AVANT
 * persistance. Cf. spec-back M1 § 2.9 + RG-1.18 a RG-1.21.
 *
 * - companyName  : UPPERCASE integral (RG-1.18)
 * - firstName / lastName (personnes) : Title Case (RG-1.19)
 * - phone* : chiffres uniquement, ex "06.12.34.56.78" -> "0612345678" (RG-1.20).
 *   Le formatage d'affichage "XX XX XX XX XX" est de la responsabilite du front.
 * - email : lowercase integral (RG-1.21)
 *
 * Toutes les methodes sont null-safe et trim-ent l'entree ; une chaine vide
 * apres trim devient null (evite de persister "" dans des colonnes nullable).
 */
final class ClientFieldNormalizer
{
    /**
     * Nom de societe en majuscules (RG-1.18). Conserve null tel quel ; une
     * chaine non vide est trim + upper. Une chaine vide reste "" (champ
     * obligatoire : c'est l'Assert\NotBlank qui rejette, pas le normalizer).
     */
    public function normalizeCompanyName(?string $value): ?string
    {
        if (null === $value) {
            return null;
        }

        return mb_strtoupper(trim($value), 'UTF-8');
    }

    /**
     * Nom/prenom de personne en Title Case (RG-1.19) : "JEAN dupont" ->
     * "Jean Dupont". Une chaine vide apres trim devient null.
     */
    public function normalizePersonName(?string $value): ?string
    {
        if (null === $value) {
            return null;
        }

        $value = trim($value);

        return '' === $value ? null : mb_convert_case($value, MB_CASE_TITLE, 'UTF-8');
    }

    /**
     * Email en minuscules (RG-1.21). Une chaine vide apres trim devient null.
     */
    public function normalizeEmail(?string $value): ?string
    {
        if (null === $value) {
            return null;
        }

        $value = trim($value);

        return '' === $value ? null : mb_strtolower($value, 'UTF-8');
    }

    /**
     * Telephone reduit aux chiffres (RG-1.20) : "06.12.34.56.78" ->
     * "0612345678". Une valeur sans aucun chiffre devient null.
     */
    public function normalizePhone(?string $value): ?string
    {
        if (null === $value) {
            return null;
        }

        $digits = preg_replace('/\D+/', '', $value) ?? '';

        return '' === $digits ? null : $digits;
    }
}
