<?php

namespace App\Shared\ValueObject;

use InvalidArgumentException;

final readonly class EmailAddress
{
    private string $normalized;

    private string $domain;

    private const ERROR_MESSAGE = 'Invalid email address:';

    public function __construct(string $email)
    {

        $trimmed = trim($email);

        if ($trimmed === '' || ! str_contains($trimmed, '@')) {
            throw new InvalidArgumentException(self::ERROR_MESSAGE." $email");
        }

        [$local, $domain] = explode('@', $trimmed, 2);
        $this->domain = mb_strtolower($domain);
        $normalized = $local.'@'.$this->domain;

        if (filter_var($normalized, FILTER_VALIDATE_EMAIL) === false) {
            throw new InvalidArgumentException(self::ERROR_MESSAGE." $email");
        }

        $this->normalized = $normalized;
    }

    public function value(): string
    {
        return $this->normalized;
    }

    public function equals(self $other): bool
    {
        return $this->normalized === $other->normalized;
    }

    public function getDomain(): string
    {
        return $this->domain;
    }

    public function __toString(): string
    {
        return $this->normalized;
    }
}
