<?php

declare(strict_types=1);

namespace app\models;

use yii;

use app\models\traits\SearchByEdge;
use app\models\Account;

/**
 * Импорт поставок
 *
 * Хранит в себе связи с поставками которые были загружены вместе
 */
class Import extends Document
{
    use SearchByEdge;

    /**
     * Имя коллекции
     */
    public static function collectionName(): string
    {
        return 'import';
    }

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

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

    /**
     * Правила
     */
    public function rules(): array
    {
        return array_merge(
            parent::rules(),
            [
                [
                    [
                        'file',
                        'name'
                    ],
                    'string'
                ]
            ]
        );
    }

    /**
     * Поиск по складу
     *
     * @param Warehouse $warehouse Инстанция склада
     * @param int $limit Ограничение по максимальному количеству
     *
     * @return array Инстанции импортов
     */
    public static function searchByWarehouse(Warehouse $warehouse, int $limit = 10): ?array
    {
        return self::searchByEdge(
            from: 'warehouse',
            to: 'import',
            edge: 'warehouse_edge_import',
            direction: 'INBOUND',
            subquery_where: [
                ['warehouse_edge_import._from' => $warehouse->readId()],
                ['warehouse_edge_import.type' => 'loaded']
            ],
            where: 'warehouse_edge_import[0] != null',
            limit: $limit
        );
    }

    /**
     * Поиск по поставке
     *
     * @param Supply $supply Поставка
     * @param int $limit Ограничение по максимальному количеству
     *
     * @return array Инстанции импортов
     */
    public static function searchBySupply(Supply $supply, int $limit = 10): ?array
    {
        return self::searchByEdge(
            from: 'supply',
            to: 'import',
            edge: 'import_edge_supply',
            direction: 'OUTBOUND',
            subquery_where: [
                ['import_edge_supply._to' => $supply->readId()],
                ['import_edge_supply.type' => 'imported']
            ],
            where: 'import_edge_supply[0] != null',
            limit: $limit
        );
    }

    /**
     * Поиск по файлу
     *
     * @param File $file Файл
     *
     * @return Import|null Инстанция импорта
     */
    public static function searchByFile(File $file): ?Import
    {
        return self::searchByEdge(
            from: 'file',
            to: 'import',
            edge: 'import_edge_file',
            direction: 'OUTBOUND',
            subquery_where: [
                ['import_edge_file._to' => $file->readId()],
                ['import_edge_supply.type' => 'connected']
            ],
            where: 'import_edge_supply[0] != null',
            limit: 1
        )[0] ?? null;
    }
}
