<?php

namespace Shm\ShmPayment\TBankPayment\TBankCollections;

use Shm\Collection\Collection;
use Shm\Shm;
use Shm\ShmPayment\TBankPayment\TBankNominal\TBankNominal;
use Shm\ShmTypes\StructureType;

class TNominalPaymentInit extends Collection
{

    public function schema(): StructureType
    {
        return Shm::structure([
            "TerminalKey" => Shm::static(TBankNominal::$TerminalKey ?? "NOT_SET"),
            "Amount" => Shm::float()->title("Сумма в копейках"),
            "OrderId" => Shm::string()->title("Идентификатор заказа")->default(function () {
                return md5(uniqid() . time());
            }),
            "Token" => Shm::string()->title("Токен (Подпись запроса)"),
            "Description" => Shm::string()->title("Описание заказа. Значение параметра будет отображено на платежной форме."),
            "CustomerKey" => Shm::string()->title("Идентификатор покупателя в системе мерчанта"),
            "Recurrent" => Shm::static("Y")->title("Операции с сохранением реквизитов карты покупателя"),
            "NotificationURL" => Shm::static(TBankNominal::$terminalNotificationUrl ?? "NOT_SET")->title("URL для уведомлений о статусе платежа"),
            "SuccessURL" => Shm::static(TBankNominal::$terminalFailUrl ?? "NOT_SET")->title("URL для перенаправления покупателя в случае успешной оплаты"),
            "FailURL" => Shm::static(TBankNominal::$terminalFailUrl ?? "NOT_SET")->title("URL для перенаправления покупателя в случае неуспешной оплаты"),
            "DATA" => Shm::structure([
                "Phone" => Shm::phone()->title("Телефон покупателя"),
                "Email" => Shm::email()->title("Email покупателя"),
            ])->title("Дополнительные данные покупателя"),
            "Receipt" => Shm::structure([
                "Email" => Shm::email()->title("Email покупателя"),
                "Phone" => Shm::phone()->title("Телефон покупателя"),
                "Taxation" => Shm::enum([
                    'osn' => 'общая СН',
                    'usn_income' => 'упрощенная СН (доходы)',
                    'usn_income_outcome' => 'упрощенная СН (доходы минус расходы)',
                    'esn' => 'единый сельскохозяйственный налог',
                    'patent' => 'патентная СН',

                ])->title("Система налогообложения"),
                "Items" => Shm::arrayOf(Shm::structure([
                    "Name" => Shm::string()->title("Наименование товара"),
                    "Price" => Shm::float()->title("Цена в копейках"),
                    "Quantity" => Shm::int()->title("Количество"),
                    "Amount" => Shm::float()->title("Сумма в копейках"),
                    "Tax" => Shm::enum([
                        'none' => 'без НДС',
                        'vat0' => 'НДС по ставке 0%',
                        'vat5' => 'НДС по ставке 5%',
                        'vat7' => 'НДС по ставке 7%',
                        'vat10' => 'НДС по ставке 10%',
                        'vat22' => 'НДС по ставке 22%',
                        'vat105' => 'НДС чека по расчетной ставке 5/105',
                        'vat107' => 'НДС чека по расчетной ставке 7/107',
                        'vat110' => 'НДС чека по расчетной ставке 10/110',
                        'vat122' => 'НДС чека по расчетной ставке 22/122',

                    ])->title("Налоговая ставка"),
                ]))->title("Товары и услуги"),

                'response' => Shm::structure([
                    "Success" => Shm::boolean()->title("Успешность операции"),
                    "ErrorCode" => Shm::string()->title("Код ошибки"),
                    "TerminalKey" => Shm::string()->title("Идентификатор терминала"),
                    "Status" => Shm::enum([
                        'NEW' => 'Новый',
                        'AUTHORIZED' => 'Авторизован',
                        'CANCELLED' => 'Отменен',
                        'FAILED' => 'Неудачный',
                        'EXPIRED' => 'Истек',
                        'CONFIRMED' => 'Подтвержден',
                    ])->title("Статус платежа"),
                    "PaymentId" => Shm::string()->title("Идентификатор платежа"),
                    "OrderId" => Shm::string()->title("Идентификатор заказа"),
                    "Amount" => Shm::float()->title("Сумма в копейках"),
                    "PaymentURL" => Shm::url()->title("URL для перенаправления покупателя на страницу оплаты"),
                ])->title("Ответ от сервиса"),
            ]),
        ]);
    }

    public static function getPaymentLink($data)
    {


        $phone = $data['DATA']['Phone'] ?? null;
        $email = $data['DATA']['Email'] ?? null;

        if (!$phone && !$email) {
            Shm::error("Для оплаты необходимо указать телефон или email");
        }

        $customerKey = TNominalCustomers::getCustomerKey($phone);

        $data['CustomerKey'] = $customerKey;

        $inser =  self::insertOne($data);

        $item = self::findOne([
            '_id' => $inser->getInsertedId()
        ]);

        echo json_encode($item);
    }
}