<?php

declare(strict_types=1);

namespace app\controllers;

use app\models\AccountEdgeNotification;
use yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\web\Response;

use app\models\Order;
use app\models\AccountEdgeOrder;

use Exception;

class OrderController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'only' => ['index'],
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['@']
                    ]
                ]
            ]
        ];
    }

    public function actionIndex()
    {

    }

    public function actionWrite(): string|array|null {
        if (yii::$app->request->isPost) {
            // POST-запрос

            // Инициализация входных данных
            $account = yii::$app->user;
            $supplies = yii::$app->request->post('supplies');

            yii::$app->response->format = Response::FORMAT_JSON;

            // Инициализация возврата по умолчанию
            $return = [
                '_csrf' => yii::$app->request->getCsrfToken()
            ];

            if (is_null($supplies)) {
                // 501 Not Implemented
                yii::$app->response->statusCode = 501;
            }

            if (!is_null($supplies)) {
                // Переданы поставки для записи

                if (!$model = Order::search($account)) {
                    // Корзина не найдена (текущий заказ)

                    // Инициализация
                    $model = new Order();
                    $model->save() or throw new Exception('Не удалось инициализировать заказ');

                    // Запись в аккаунт
                    AccountEdgeOrder::write($account->id, $model->readId(), 'current') or $model->addError('errors', 'Не удалось инициализировать ребро: АККАУНТ -> ЗАКАЗ');
                }

                // Проверка входных данных
                if (!is_array($supplies)) {
                    // Неверные входные данные

                    // Запись ошибки
                    $model->addError('errors', 'Переменная должна быть массивом');
                }

                // Если запись не удалась, то вернуть код: 500 Internal Server Error
                $model->write($supplies) or yii::$app->response->statusCode = 500;
            }

            return $return;
        }

        yii::$app->response->statusCode = 500;

        return null;
    }
}
