<?php

namespace Lucent\Schema;

use Lucent\Primitive\Collection;

class SchemaService
{


    public function __construct()
    {
    }

    public function fromArray(array $schemaArr): Schema
    {

        return match ($schemaArr["type"]) {
            "collection" => new CollectionSchema(
                name: $schemaArr["name"],
                label: $schemaArr["label"],
                visible: $schemaArr["visible"] ?? [],
                groups: $schemaArr["groups"] ?? [],
                fields: (new Collection($schemaArr["fields"]))->map([$this, 'mapFields']),
                isEntry: $schemaArr["isEntry"] ?? false,
                color: $schemaArr["color"] ?? "",
                sortBy: $schemaArr["sortBy"] ?? "-_sys.updatedAt",
                titleTemplate: $schemaArr["titleTemplate"] ?? "",
                revisions: $schemaArr["revisions"] ?? 0,
                read: $schemaArr["read"] ?? [],
                write: $schemaArr["write"] ?? [],
            ),
            "files" => new FilesSchema(
                name: $schemaArr["name"],
                label: $schemaArr["label"],
                fields: (new Collection($schemaArr["fields"]))->map([$this, 'mapFields']),
                path: $schemaArr["path"] ?? $schemaArr["name"],
                groups: $schemaArr["groups"] ?? [],
                isEntry: $schemaArr["isEntry"] ?? false,
                sortBy: $schemaArr["sortBy"] ?? "-_sys.updatedAt",
                color: $schemaArr["color"] ?? "",
                titleTemplate: $schemaArr["titleTemplate"] ?? "",
                revisions: $schemaArr["revisions"] ?? 0,
                read: $schemaArr["read"] ?? [],
                write: $schemaArr["write"] ?? [],
            ),
            "block" => new BlockSchema(
                name: $schemaArr["name"],
                label: $schemaArr["label"],
                fields: (new Collection($schemaArr["fields"]))->map([$this, 'mapBlockFields'])
            )
        };

    }

    public function mapFields(array $field): FieldInterface
    {
        $className = "\\Lucent\Schema\Ui\\" . ucfirst($field["ui"]);
        unset($field["ui"]);
        return new $className(...$field);
    }

    public function mapBlockFields(array $field): FieldInterface
    {
        $className = "\\Lucent\Schema\BlockUi\\" . ucfirst($field["ui"]);
        unset($field["ui"]);
        return new $className(...$field);
    }




//
//    /**
//     * @param array<string> $visible
//     * @throws LucentException
//     */
//    public function create(
//        string $name,
//        string $label,
//        string $type,
//        bool   $isEntry,
//        int    $revisionRetentionDays,
//        int    $revisionRetentionNumber,
//        int    $trashedRetentionDays,
//        array  $fields,
//        string $titleTemplate = "",
//        array  $visible = [],
//        string $path = ""
//    ): Schema
//    {
//        if (empty($name) || empty($label)) {
//            throw new LucentException("Name and Label are required");
//        }
//
//        $newFields = [];
//        if (!empty($fields)) {
//            $newFields = array_map([Field::class, 'fromArray'], $fields);
//        }
//
//        $schema = new Schema(
//            name: new SchemaName($name),
//            label: $label,
//            type: Type::from($type),
//            visible: new Collection($visible),
//            fields: new Collection($newFields),
//            isEntry: $isEntry,
//            color: "",
//            titleTemplate: $titleTemplate,
//            views: new Collection(),
//            revisionRetentionDays: $revisionRetentionDays,
//            revisionRetentionNumber: $revisionRetentionNumber,
//            trashedRetentionDays: $trashedRetentionDays,
//            path: $path,
//        );
//
//        $this->schemaRepo->insert($schema);
//        return $schema;
//
//    }
//
//    /**
//     * @param array<string> $visible
//     * @throws LucentException
//     */
//    public function update(
//        string $name,
//        string $label,
//        bool   $isEntry,
//        string $color,
//        array  $visible,
//        string $titleTemplate,
//        int    $revisionRetentionDays,
//        int    $revisionRetentionNumber,
//        int    $trashedRetentionDays,
//        string $path = ""
//    ): Schema
//    {
//        if (empty($name) || empty($label)) {
//            throw new LucentException("Name and Label are required");
//        }
//
//
//        $channel = ChannelRepo::current();
//        $schema = $channel->schemas->firstWhere("name", $name);
//        $schema->label = $label;
//        $schema->isEntry = $isEntry;
//        $schema->color = $color;
//        $schema->visible = new Collection($visible);
//        $schema->titleTemplate = $titleTemplate;
//        $schema->revisionRetentionDays = $revisionRetentionDays;
//        $schema->revisionRetentionNumber = $revisionRetentionNumber;
//        $schema->trashedRetentionDays = $trashedRetentionDays;
//        $schema->path = $path;
//        $this->schemaRepo->update($schema);
//        return $schema;
//    }
//
//    public function delete(string $name): void
//    {
//        $channel = ChannelRepo::current();
//        $schema = $channel->schemas->firstWhere("name", $name);
//        if ($schema) {
//            $this->schemaRepo->delete($schema);
//        }
//
//    }
}
