*/ public static function default_theme(): array { return [ 'accent' => 'var(--bl-accent)', 'radius' => 'var(--r-md)', 'font' => 'var(--font-sans)', 'density' => 'comfortable', 'scheme' => 'light', 'slot_style' => 'bordered', ]; } /** * Constructor. * * @param int|null $id Database id. * @param Uuid $uuid Public id. * @param string $name Display name. * @param string $slug Unique slug. * @param list $steps Ordered step names. * @param list|null $service_ids Scoped services. * @param list|null $agent_ids Scoped agents. * @param list|null $location_ids Scoped locations. * @param list|null $category_ids Scoped categories. * @param array $settings Behaviour flags. * @param array $theme Six theme tokens. * @param BookingFormStatus $status Publication status. * @param DateTimeImmutable $created_at Created UTC. * @param DateTimeImmutable $updated_at Updated UTC. * * @throws DomainException When invariants fail. */ public function __construct( private ?int $id, private Uuid $uuid, private string $name, private string $slug, private array $steps, private ?array $service_ids, private ?array $agent_ids, private ?array $location_ids, private ?array $category_ids, private array $settings, private array $theme, private BookingFormStatus $status, private DateTimeImmutable $created_at, private DateTimeImmutable $updated_at, ) { if ( '' === trim( $this->name ) ) { throw new DomainException( 'booking_form.name_empty', 'Form name must not be empty.' ); } if ( '' === trim( $this->slug ) ) { throw new DomainException( 'booking_form.slug_empty', 'Form slug must not be empty.' ); } if ( [] === $this->steps ) { throw new DomainException( 'booking_form.steps_empty', 'At least one step is required.' ); } } /** * Assign database id after insert. * * @param int $id Database id. */ public function assign_id( int $id ): void { $this->id = $id; } /** * Database id. */ public function id(): ?int { return $this->id; } /** * Public UUID. */ public function uuid(): Uuid { return $this->uuid; } /** * Display name. */ public function name(): string { return $this->name; } /** * Unique slug. */ public function slug(): string { return $this->slug; } /** * Ordered step names. * * @return list */ public function steps(): array { return $this->steps; } /** * Scoped service ids. * * @return list|null */ public function service_ids(): ?array { return $this->service_ids; } /** * Scoped agent ids. * * @return list|null */ public function agent_ids(): ?array { return $this->agent_ids; } /** * Scoped location ids. * * @return list|null */ public function location_ids(): ?array { return $this->location_ids; } /** * Scoped category ids. * * @return list|null */ public function category_ids(): ?array { return $this->category_ids; } /** * Behaviour flags. * * @return array */ public function settings(): array { return $this->settings; } /** * Six theme tokens. * * @return array */ public function theme(): array { return $this->theme; } /** * Publication status. */ public function status(): BookingFormStatus { return $this->status; } /** * Created instant (UTC). */ public function created_at(): DateTimeImmutable { return $this->created_at; } /** * Updated instant (UTC). */ public function updated_at(): DateTimeImmutable { return $this->updated_at; } }