<?php

declare(strict_types=1);

namespace App\Module\Commercial\Application\Service;

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