<?php

declare(strict_types=1);

namespace App\Module\Technique\Application\Service;

/**
 * Normalisation serveur des champs texte d'un Provider / ProviderContact,
 * appliquee par le ProviderProcessor (et les processors de sous-ressources,
 * ticket ulterieur M3) AVANT persistance. Cf. spec-back M3 § 2.11 + RG-3.11.
 * Jumeau de SupplierFieldNormalizer (M2) — duplique volontairement (isolation
 * Commercial / Technique, decision § 2.1).
 *
 * - companyName : UPPERCASE integral (RG-3.11)
 * - firstName / lastName (personnes, sur ProviderContact) : Title Case (RG-3.11)
 * - phone* : chiffres uniquement, ex "06.12.34.56.78" -> "0612345678" (RG-3.11).
 *   Le formatage d'affichage "XX XX XX XX XX" est de la responsabilite du front.
 * - email : lowercase integral (RG-3.11)
 *
 * 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 ProviderFieldNormalizer
{
    /**
     * Nom de societe en majuscules (RG-3.11). 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-3.11) : "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-3.11). 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');
    }

    /**
     * Texte libre simplement trim (ex : jobTitle / Fonction du contact). Pas de
     * changement de casse — on preserve la saisie. Une chaine vide apres trim
     * devient null (evite de persister "" et de faire passer a tort le garde-fou
     * RG-3.04 / le CHECK chk_provider_contact_name sur une Fonction vide).
     */
    public function normalizeText(?string $value): ?string
    {
        if (null === $value) {
            return null;
        }

        $value = trim($value);

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

    /**
     * Telephone reduit aux chiffres (RG-3.11) : "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;
    }
}
