<?php
/**
 * Этот контроллер обеспечивает прием данных со стороны битрикса.
 * На входе - обязательный параметр "action" 
 * и токен объекта, по которому определяется, с каким объектом продолжать работу.
 * Метод index проверяет action и если нашел его среди констант класса,
 * направляет в соответствующий обработчик.
 * Если action не найден, то возвращает false.
 * Если по токену не найден объект, то возвращает false.
 */
namespace Modules\Bitrix\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

use Modules\Main\Models\Deal\Deal;
use Modules\Main\Models\Deal\DealStatus;
use App\Notifications\UniqueContact;
use App\Notifications\NotUniqueContact;
use App\Notifications\Deal\DealUnique;
use App\Notifications\Deal\DealNotUnique;

use Modules\Bitrix\Models\BitrixId;

use Illuminate\Support\Facades\Log;

class BitrixApiController extends Controller
{
    public const ACTION_CONFIRM_DEAL = 'confirm_deal';
    public const ACTION_UPDATE_CONTRACT = 'update_contract';
    public const ACTION_CONFIRM_COMPANY = 'confirm_company';
    public function index(Request $request): bool
    {
        if (!$bxId = BitrixId::where('token', $request->token)->first()) {
            return false;
        };
        $object = $bxId->bitrixable;
        switch ($request->action) {
            case $this::ACTION_CONFIRM_DEAL:
                return $this->confirmDeal($object, $request);
                break;
            case $this::ACTION_UPDATE_CONTRACT:
                return $this->updateContract($object, $request);
                break;
            case $this::ACTION_CONFIRM_COMPANY:
                return $this->confirmCompany($request, $object);
                break;
        }
        return false;
    }

    public function confirmCompany(Request $request, $company)
    {
        $confirmer = new ConfirmCompanyController;
        return $confirmer($request, $company);
    }
    public function confirmDeal(Deal $deal, Request $request)
    {
        $agent = $deal->agent;
        $request->is_unique = json_decode($request->is_unique, true);//т.к. приходит в строке
        if ($request->is_unique == true) {
            $deal->status = DealStatus::UNIQUE;
            if ($request->has('unique_until')) {
                $deal->unique_until = $request->unique_until;
            }
            $agent->user->notify(new UniqueContact($deal));
        } else {
            $deal->status = DealStatus::NOT_UNIQUE;
            $agent->user->notify(new NotUniqueContact($deal));
        }
        if (!$agent->bitrixId()) {
            $agent->setBitrixId($request->agent_id);
        }
        $deal->save();
        return true;
    }

    public function updateContract(Deal $deal, Request $request)
    {
        //print_r($request->all());die();
        $contract = new ContractUpdateController;
        return $contract($deal, $request);
    }
}
