<?php

namespace console\controllers;

use backend\components\ContractManager;
use common\models\Card;
use common\models\Contract;
use common\models\Customer;
use common\models\ShoppingCart;
use common\models\Ticket;
use common\models\TicketInstallmentRequest;
use common\models\Transfer;
use yii\console\Controller;
use yii\console\Exception;

class ContractController extends Controller
{


    /**
     * @param $requestId
     * @throws \Throwable
     * @throws \yii\web\NotFoundHttpException
     */
    public function actionRequestToCart($requestId){
        $contractManager = new ContractManager();
        $contractManager->openRequestAndPutItItoCart($requestId);
    }

    /**
     * @param $cardNumber
     * @throws Exception
     * @throws \yii\db\Exception
     */
    public function actionRestoreCanceled($cardNumber)
    {

        $card = Card::findOne(['number' => $cardNumber]);
        if (!isset($card)) {
            throw new Exception("Card not found: " . $cardNumber);
        }

        $this->info("Card loaded");
        $this->info($card->id_card);
        $this->info($card->number);

        $customer = Customer::findOne(['id_customer_card' => $card->id_card]);
        if (!isset($customer)) {
            throw new Exception("Customer not found for card: " . $cardNumber);
        }

        $this->info("Customer loaded");
        $this->info($customer->id_customer);
        $this->info($customer->name);


        // find latest contract for customer
        /** @var \common\models\Contract $contract */
        $contract = Contract::find()
            ->andWhere(['id_customer' => $customer->id_customer])
            ->orderBy(['created_at' => SORT_DESC])
            ->limit(1)
            ->one();

        if (!isset($contract)) {
            throw new Exception("Contract not found for customer: " . $customer->id_customer);
        }

        $this->info("Contract loaded");
        $this->info($contract->id_contract);
        $this->info(Contract::toFlangName($contract->flag));

        $parts = TicketInstallmentRequest::findAll(['id_contract' => $contract->id_contract]);
        $this->info("Parts loaded");

        $tx = \Yii::$app->db->beginTransaction();
        try {
            if (!$contract->isFlagActive()) {
                $contract->flag = Contract::$FLAG_ACTIVE;
                $I_CONTRACT = "Contract - change flag " . Contract::toStatusName($contract->flag) . "=>" .
                    Contract::toStatusName(Contract::$FLAG_ACTIVE);
                $contract->save(false);
                $this->info($I_CONTRACT);
            }

            foreach ($parts as $part) {
                $this->info("Part #" . $part->priority . " ->" . TicketInstallmentRequest::toStatusName($part->status));
                if ($part->status == TicketInstallmentRequest::$STATUS_CANCELED) {
                    $part->status = TicketInstallmentRequest::$STATUS_PENDING;
                    $part->request_processed_at = null;
                    $part->save(false);
                    $this->info("Change status: "
                        . TicketInstallmentRequest::toStatusName(TicketInstallmentRequest::$STATUS_CANCELED)
                        . "->"
                        . TicketInstallmentRequest::toStatusName(TicketInstallmentRequest::$STATUS_PENDING)
                    );
                } else if ($part->isStatusAccepted()) {
                    $this->info("loading ticket: #" .$part->id_ticket);
                    /** @var \common\models\Ticket $ticket */
                    $ticket = null;
                    try {
                            $ticket = Ticket::findOne(['id_ticket' => $part->id_ticket]);
                    }catch (\Throwable $e){
                        \Yii::info("Failed to load ticket: " . $e->getMessage());
                    }
                    if (isset($ticket)) {
                        $this->info("Ticket found: " . $ticket->id_ticket . "/" . $ticket->ticketType->name);
                        if ($ticket->status == Ticket::STATUS_DELETED) {
                            $ticket->status = Ticket::STATUS_ACTIVE;
                            $ticket->save(false);
                            $this->info("Ticket restored: ");
                            $this->info($ticket->id_ticket);
                            $this->info(Ticket::toStatusName(Ticket::STATUS_DELETED)
                                . "->"
                                . Ticket::toStatusName(Ticket::STATUS_ACTIVE)
                            );

                        }
                        /** @var \common\models\Transfer $transfer */
                        $transfer = $ticket->transfer;
                        if ($transfer->status == Transfer::STATUS_STORNO) {
                            $transfer->status = Transfer::STATUS_PAID;
                            $transfer->save(false);

                            $this->info("Restore transfer: ");
                            $this->info($transfer->id_transfer);
                            $this->info(Transfer::toStatusName(Transfer::STATUS_STORNO)
                                . "->"
                                . Ticket::toStatusName(Transfer::STATUS_PAID)
                            );

                            if (!isset($transfer->paid_at)) {
                                $cart = new ShoppingCart();
                                $cart->id_customer = $contract->customer->id_customer;
                                $cart->id_transfer = $transfer->id_transfer;
                                if (!$cart->save(false)) {
                                    /** @noinspection SpellCheckingInspection */
                                    $E_FAILED_TO_SAVE = "Vendég kosár hozzárendelés sikertelen!";
                                    \Yii::error($E_FAILED_TO_SAVE);
                                    throw new \Exception($E_FAILED_TO_SAVE);
                                }
                            }
                        }
                    }else{
                        \Yii::info("Ticket not found");
                    }
                }
            }
            $tx->commit();
            $this->info("Ready");
        } catch (\Throwable $e) {
            $tx->rollBack();
        }

    }


    private function info($msg)
    {
        echo $msg . "\n";
    }

}
