<?php

declare(strict_types=1);

namespace App\Support\Ui\EnterpriseDetail;

final readonly class DetailSectionData
{
    /**
     * @param  list<array<string, mixed>>  $items
     * @param  array{title: string, description?: ?string, icon?: ?string}|null  $emptyState
     * @param  array<string, mixed>  $viewData
     */
    public function __construct(
        public string $id,
        public string $kind,
        public string $title,
        public array $items = [],
        public ?array $emptyState = null,
        public ?PageActionData $action = null,
        public bool $visible = true,
        public ?string $description = null,
        public ?string $view = null,
        public array $viewData = [],
        public bool $collapsible = false,
        public bool $collapsed = false,
    ) {}

    public function shouldRender(): bool
    {
        if (! $this->visible || trim($this->title) === '') {
            return false;
        }

        return $this->items !== []
            || $this->view !== null
            || $this->emptyState !== null;
    }

    /**
     * @return array{
     *     id: string,
     *     kind: string,
     *     title: string,
     *     items: list<array<string, mixed>>,
     *     emptyState: array{title: string, description?: ?string, icon?: ?string}|null,
     *     action: array{label: string, placement: string, url: ?string, actionName: ?string, destructive: bool, requiresConfirmation: bool, visible: bool, icon: ?string, openInNewTab: bool}|null,
     *     visible: bool,
     *     description: ?string,
     *     view: ?string,
     *     viewData: array<string, mixed>,
     *     collapsible: bool,
     *     collapsed: bool
     * }
     */
    public function toArray(): array
    {
        return [
            'id' => $this->id,
            'kind' => $this->kind,
            'title' => $this->title,
            'items' => array_values($this->items),
            'emptyState' => $this->emptyState,
            'action' => $this->action?->isRenderable() === true ? $this->action->toArray() : null,
            'visible' => $this->visible,
            'description' => $this->description,
            'view' => $this->view,
            'viewData' => $this->viewData,
            'collapsible' => $this->collapsible,
            'collapsed' => $this->collapsed,
        ];
    }
}
