<?php

declare(strict_types=1);

namespace app\models;

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

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

    /**
     * Метки свойств
     */
    public function attributeLabels(): array
    {
        return array_merge(
            parent::attributeLabels(),
            [
                'comm' => 'Комментарий',
                'cost' => 'Цена',
                'time' => 'Время',
                'stts' => 'Статус',
                'dlvr' => 'Доставка'
            ]
        );
    }

    /**
     * Правила
     */
    public function rules(): array
    {
        return array_merge(
            parent::rules(),
            [
                [
                    'comm',
                    'string',
                    'length' => [0, 300],
                    'message' => '{attribute} должен быть строкой от 0 до 300 символов'
                ],
                [
                    'stts',
                    'string',
                    'length' => [0, 15],
                    'message' => '{attribute} должен быть строкой от 0 до 15 символов'
                ],
                [
                    'cost',
                    'integer',
                    'message' => '{attribute} должна быть числом'
                ],
                [
                    'time',
                    'integer',
                    'message' => '{attribute} должно быть числом'
                ],
                [
                    'dlvr',
                    'arrayValidator',
                    'message' => '{attribute} должен быть массивом'
                ]
            ]
        );
    }

    /**
     * Поиск поставки по артикулу
     *
     * @param string $catn Артикул
     * @param Order $order Заказ
     * @param int $limit Максимальное количество
     *
     * @return array Поставки
     *
     * @deprecated
     */
    public static function searchBySupplyCatn(string $catn, Order $order = null, int $limit = 10): array
    {
        if ($supply = Supply::searchByCatn($catn, 1)) {
            // Поставка найдена

            if (isset($order)) {
                // Поиск только по определённому заказу

                return self::find()->where(['_from' => $order->readId(), '_to' => $supply->readId()])->limit($limit)->all();
            }

            return self::find()->where(['_to' => $supply->readId()])->limit($limit)->all();
        }

        return [];
    }


    /**
     * Поиск по данным поставки
     *
     * @param string $catn Артикул
     * @param Order $order Заказ
     * @param int $limit Максимальное количество
     *
     * @return array Поставки
     */
    public static function searchBySupplyData(string $catn, string $prod, ?string $delivery = null, ?Order $order = null, int $limit = 10): array
    {
        if ($supply = Supply::searchByCatnAndProd($catn, $prod)) {
            // Поставка найдена

            if (isset($order)) {
                // Поиск только по определённому заказу

                if (isset($delivery)) {
                    // Поиск только по определённым типам доставки

                    return self::find()->where(['_from' => $order->readId(), '_to' => $supply->readId(), 'order_edge_supply.dlvr.type' => $delivery])->limit($limit)->all();
                }

                return self::find()->where(['_from' => $order->readId(), '_to' => $supply->readId()])->limit($limit)->all();
            }

            return self::find()->where(['_to' => $supply->readId()])->limit($limit)->all();
        }

        return [];
    }

    /**
     * Генерация ярлыка на русском языке для статуса заказа
     *
     * @param string|null $status Статус заказа
     *
     * @return string Ярлык статуса на русском языке
     */
    public static function statusToRussian(?string $status = 'processing'): string
    {
        return match ($status) {
            'requested' => 'Запрошен',
            'accepted' => 'Ожидается отправка',
            'going' => 'Доставляется',
            'completed' => 'Завершен',
            'processing' => 'Обрабатывается',
            default => 'Обрабатывается'
        };
    }
}
