<?php

namespace App\Traits;
use App\Models\Country;
use Illuminate\Support\Collection;
use Carbon\Carbon;

trait ManageAddress
{
    public Collection $countries;
    public bool $professionnal = false;
    public array $civilities = [['id' => 'M.', 'name' => 'M.'], ['id' => 'Mme', 'name' => 'Mme']];
    public string $civility = 'M.';
    public ?string $firstname = null;
    public ?string $name = null;
    public ?string $company = null;
    public ?string $address = null;
    public ?string $buyer_tax_no = null;
    public ?string $siren = null;
    public ?string $addressbis = null;
    public ?string $bp = null;
    public string $postal = '';
    public string $city = '';
    public ?Country $country = null;
    public int $country_id;
    public string $phone = '';

    /**
     * @return array
     */
    protected function rules(): array
    {
        $sirenObligatoire = $this->professionnal
            && $this->country?->requires_siren
            && Carbon::parse(config('app.facturation_electronique.obligatoire_a_partir_du'))->isPast();

        return [
            'professionnal' => 'required|boolean',
            'civility' => 'required|in:M.,Mme',
            'firstname' => 'required_unless:professionnal,true|nullable|string|max:100',
            'name' => 'required_unless:professionnal,true|nullable|string|max:100',
            'company' => 'required_unless:professionnal,false|nullable|string|max:100',
            'address' => 'required|string|max:255',
            'addressbis' => 'nullable|string|max:255',
            'bp' => 'nullable|string|max:100',
            'postal' => 'required|string',
            'city' => 'required|string|max:100',
            'country_id' => 'required|integer|exists:countries,id',
            'phone' => 'required|numeric',
            'buyer_tax_no' => [
                'nullable',
                'string',
                'max:20',
                function ($attribute, $value, $fail) {
                    // Si le client est un professionnel ET que buyer_tax_no est renseigné
                    if ($this->professionnal && $value !== null) {
                        // Regex pour les numéros de TVA intracommunautaire (format UE)
                        $tvaUeRegex = '/^[A-Z]{2}[0-9]{8,12}$/'; // Ex: FR12345678901, DE123456789

                        if (!preg_match($tvaUeRegex, $value)) {
                            $fail('Le numéro de TVA semble invalide. Format attendu : [PAYS][CHIFFRES] (ex: FR12345678901).');
                        }
                    }
                },
            ],
            'siren' => [
                'nullable',
                'string',
                'max:14',
                function ($attribute, $value, $fail) use ($sirenObligatoire) {
                    if ($sirenObligatoire) {
                        if (empty($value)) {
                            $fail('Le SIREN ou SIRET est obligatoire pour la facturation électronique.');
                            return;
                        }
                        $sirenRegex = '/^[0-9]{9}$/';   // SIREN
                        $siretRegex = '/^[0-9]{14}$/'; // SIRET
                        if (!preg_match($sirenRegex, $value) && !preg_match($siretRegex, $value)) {
                            $fail('Le SIREN ou SIRET doit contenir 9 ou 14 chiffres.');
                        }
                    }
                },
            ],
        ];
    }

    /**
     * Met à jour les propriétés en fonction des changements de champs.
     *
     * @param string $property Le nom de la propriété modifiée.
     * @param mixed $value La nouvelle valeur de la propriété.
     */
    public function updated(string $property, mixed $value): void
    {
        match ($property) {
            'country_id' => $this->country = Country::find($value),
            'professionnal' => $this->resetProfessionalFields(),
            default => null,
        };
    }

    /**
     * @return void
     */
    private function resetProfessionalFields(): void
    {
        $this->company = null;
        $this->buyer_tax_no = null;
        $this->siren = null;
    }
}
