<?php

declare(strict_types=1);

namespace App\Shared\Domain\Contract;

/**
 * Contrat minimal d'une adresse de Client (M1 Commercial) exposable a un autre
 * module sans couplage direct (regle ABSOLUE n°1). Mappe vers
 * App\Module\Commercial\Domain\Entity\ClientAddress via `resolve_target_entities`.
 *
 * Implemente par App\Module\Commercial\Domain\Entity\ClientAddress. Utilise
 * comme type-hint des relations ORM cross-module (ex: CarrierPrice.clientDeliveryAddress,
 * M4). La serialisation passe par le read-group de l'entite concrete
 * (client_address:read), pas par cette interface.
 */
interface ClientAddressInterface
{
    public function getId(): ?int;

    /**
     * Client parent de l'adresse. Expose le lien inverse sans coupler au module
     * Commercial : permet a un autre module de verifier l'appartenance d'une
     * adresse a un client (ex: CarrierPrice, RG-4.10 — l'adresse de livraison
     * doit appartenir au client choisi). Retour covariant ?Client cote entite.
     */
    public function getClient(): ?ClientInterface;
}
