<?php
declare(strict_types=1);
namespace Aen\SerializerWorkshop;

use Symfony\Component\Serializer\Attribute\Groups;
use Symfony\Component\Serializer\Attribute\MaxDepth;
use Symfony\Component\Validator\Constraints as Assert;

final class Customer
{
    public function __construct(public string $name, public string $email, public bool $active = true) {}
}
final class Contact
{
    public function __construct(public string $firstName, public string $postalCode, public bool $sendNews = false) {}
}
final class Profile
{
    public function __construct(
        #[Groups(['public', 'admin'])] public int $id,
        #[Groups(['public', 'admin'])] public string $name,
        #[Groups(['admin'])] public string $email,
        #[Groups(['admin'])] public string $internalNote = ''
    ) {}
}
final class Meeting
{
    public function __construct(public string $title, public \DateTimeImmutable $startsAt) {}
}
final class Address
{
    public function __construct(public string $city, public string $street) {}
}
final class Item
{
    public function __construct(public string $sku, public int $quantity, public string $price) {}
}
final class Order
{
    public string $id;
    public Address $address;
    /** @var Item[] */
    public array $items;
    /** @param Item[] $items */
    public function __construct(string $id, Address $address, array $items)
    {
        $this->id = $id;
        $this->address = $address;
        $this->items = $items;
    }
}
final class Preferences
{
    public function __construct(public string $name, public ?string $note, public bool $active = false) {}
}
final class Team
{
    public function __construct(public int $id, public string $name) {}
    /** @var Member[] */
    public array $members = [];
}
final class Member
{
    public function __construct(public int $id, public string $name) {}
    public ?Team $team = null;
}
final class TreeNode
{
    public function __construct(public string $name) {}
    #[MaxDepth(1)]
    public ?TreeNode $child = null;
}
final class Signup
{
    public function __construct(
        #[Assert\NotBlank] #[Assert\Length(min: 2, max: 60)] public string $name,
        #[Assert\Email] #[Assert\NotBlank] public string $email,
        #[Assert\Range(min: 18, max: 120)] public int $age,
        #[Assert\IsTrue(message: 'Нужно принять условия учебной формы.')] public bool $consent = false
    ) {}
}
