<?php

declare(strict_types=1);

namespace app\models;

use carono\exchange1c\interfaces\GroupInterface;

use Zenwalker\CommerceML\Model\Group;

/**
 * Группировка продуктов
 */
class ProductGroup extends Document implements GroupInterface
{
    /**
     * Имя коллекции
     */
    public static function collectionName(): string
    {
        return 'product_group';
    }

    /**
     * Свойства
     */
    public function attributes(): array
    {
        return array_merge(
            parent::attributes(),
            [
                'name'
            ]
        );
    }

    /**
     * Метки свойств
     */
    public function attributeLabels(): array
    {
        return array_merge(
            parent::attributeLabels(),
            [
                'name' => 'Название (name)'
            ]
        );
    }

    /**
     * Правила
     */
    public function rules(): array
    {
        return array_merge(
            parent::rules(),
            [
                // [
                //     'name',
                //     'required',
                //     'message' => 'Заполните поле: {attribute}'
                // ]
            ]
        );
    }

    /**
     * Запись члена группы
     */
    public function writeMember(Product $member): ProductEdgeProductGroup
    {
        return ProductEdgeProductGroup::write($member->readId(), $this->readId(), 'member');
    }

    /**
     * Запись рёбер групп
     *
     * Создание взаимоотношений между группами по типу древовидной системы
     */
    public static function createTree1c($groups): Document|null
    {
        foreach ($groups as $group) {
            // Перебор групп

            // Создание
            $parent = static::createByML($group);

            if ($children = $group->getChildren()) {
                // Найден потомок

                // Вход в рекурсию
                $children = static::createTree1c($children);

                // Запись рёбер с родителем
                static::writeEdgeBetweenGroup($parent::collectionName() . '/' . $parent->_key, $children::collectionName() . '/' . $children->_key);

                return $children;
            }

            return $parent;
        }
    }

    /**
     * Запись группы
     *
     * Создаём группу по модели группы CommerceML
     * проверяем все дерево родителей группы,
     * если родителя нет в базе - создаём
     */
    public static function createByML(Group $group): static|array|null
    {
        // if (!$model = static::readByOnecId($group->id)) {
        //     // Группа не найдена

        //     // Инициализация
        //     $model = new static;

        //     $model->onec_id = $group->id;
        // }

        // $model->name = $group->name;

        // if ($parent = $group->getParent()) {
        //     // Найден родитель

        //     // Инициализация (рекурсия)
        //     $parentModel = static::createByML($parent);

        //     $model->onec_prnt_id = $parentModel->id;

        //     unset($parentModel);
        // } else {
        //     $model->onec_prnt_id = null;
        // }

        // $model->save();

        // return $model;

        return null;
    }

    private static function writeEdgeBetweenGroup(string $from, string $to): bool
    {
        // Инициализация
        $edge = new ProductGroupEdgeProductGroup();

        // Настройка
        $edge->_from = $from;
        $edge->_to = $to;

        // Запись
        return $edge->save();
    }

    public static function readByName(string $name)
    {
        return static::findOne(['name' => $name]);
    }

    /**
     * Название поля в котором хранится ID из 1C
     */
    public static function getIdFieldName1c(): string
    {
        return 'onec_id';
    }

    public static function readByOnecId(string $onec_id): ?ProductGroup
    {
        return static::findOne(['onec_id' => $onec_id]);
    }
}
