<?php

namespace App\Modules\WebContactMessage\Infraestructure;

use App\Modules\Shared\Domain\DateEnd;
use App\Modules\Shared\Domain\DateStart;
use App\Modules\Shared\Domain\Storage\Criteria\ConcreteStorageCriteria;
use App\Modules\Shared\Domain\Storage\Criteria\StorageCriteria;
use App\Modules\Shared\Infraestructure\DBRequester;
use App\Modules\Shared\Infraestructure\RequestChecker;
use App\Modules\Shared\Infraestructure\Storage\Criteria\LaravelCriteriaMatcher;
use App\Modules\WebContact\Domain\IdWebContact;
use App\Modules\WebContactMessage\Domain\WebContactMessage;
use App\Modules\WebContactMessage\Domain\WebContactMessageRepository;
use App\Modules\WebContactMessage\Domain\IdWebContactMessage;
use App\Modules\WebContactMessage\Domain\UpdateWebContactMessage;

class MysqlWebContactMessageRepository implements WebContactMessageRepository
{
    public function search(StorageCriteria $criteria)
    {
        return $criteria->run();
    }

    public function searchWithConcrete(ConcreteStorageCriteria $criteria)
    {
        return LaravelCriteriaMatcher::match($criteria);
    }

    public function findAll(DateStart $dateStart, DateEnd $dateEnd, string $action)
    {
        return RequestChecker::requestSelect(
            'CALL sp_web_contact_message_list_all(?,?,?,@sts,@cod,@msg)',
            [
                $dateStart->value(),
                $dateEnd->value(),
                $action
            ]
        );
    }

    public function find(IdWebContact $idWebContact, string $action)
    {
        return RequestChecker::requestSelect(
            'CALL sp_web_contact_message_list(?,?,@sts,@cod,@msg)',
            [
                $idWebContact->value(),
                $action
            ]
        );
    }

    public function index(IdWebContactMessage $id)
    {
        return RequestChecker::requestSelect(
            'CALL sp_web_contact_message_index(?,@sts,@cod,@msg)',
            [
                $id->value(),
            ]
        );
    }

    public function insert(WebContactMessage $value)
    {
        return RequestChecker::requestInsert(
            'CALL sp_web_contact_message_insert(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,@sts,@cod,@msg,@id)',
            [
                $value->dateDeparture()->value(),
                $value->dateSend()->value(),
                $value->dateReception()->value(),
                $value->name()->value(),
                $value->lastName()->value(),
                $value->email()->value(),
                $value->country()->value(),
                $value->countryCurrent()->value(),
                $value->phoneCode()->value(),
                $value->phone()->value(),
                $value->idCountry()->value(),
                $value->idCountryCurrent()->value(),

                $value->message()->value(),
                $value->adults()->value(),
                $value->children()->value(),
                $value->subscription()->value(),
                $value->origin()->value(),
                $value->type()->value(),
                $value->status()->value(),
                $value->idWebContact()->value(),
                $value->idLanguage()->value(),

                $value->code()->value(),
                $value->dateFirstContact()->value(),
                $value->dateAssign()->value(),
                $value->dateFirstAnswer()->value(),
                $value->dateSale()->value(),
                $value->firstMessage()->value(),
                $value->account()->value(),
                $value->lostMessage()->value(),
                $value->lostDate()->value(),
                $value->route()->value(),

                $value->idChannel()->value(),
                $value->idLanguageContact()->value(),
                $value->idLanguageAnswer()->value(),
                $value->idWebTypeClient()->value(),
                $value->idAdminAssigner()->value(),
                $value->idAdmin()->value(),
            ]
        );
    }

    public function update(UpdateWebContactMessage $value)
    {
        return RequestChecker::requestUpdate(
            'CALL sp_web_contact_message_update(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,@sts,@cod,@msg)',
            [
                $value->id()->value(),
                $value->dateReception()->value(),
                $value->email()->value(),
                $value->phoneCode()->value(),
                $value->phone()->value(),
                $value->message()->value(),
                $value->adults()->value(),
                $value->children()->value(),
                $value->code()->value(),
                $value->subscription()->value(),
                $value->status()->value(),
                $value->dateFirstContact()->value(),
                $value->dateAssign()->value(),
                $value->dateFirstAnswer()->value(),
                $value->dateSale()->value(),
                $value->firstMessage()->value(),
                $value->account()->value(),
                $value->lostMessage()->value(),
                $value->lostDate()->value(),
                $value->name()->value(),
                $value->lastName()->value(),
                $value->adminRemark()->value(),
                $value->route()->value(),
                $value->idWebContact()->value(),
                $value->idCountry()->value(),
                $value->idCountryCurrent()->value(),
                $value->idLanguage()->value(),
                $value->idChannel()->value(),
                $value->idLanguageContact()->value(),
                $value->idLanguageAnswer()->value(),
                $value->idWebTypeClient()->value(),
                $value->idAdminAssigner()->value(),
                $value->idAdmin()->value(),
                $value->idWebPage()->value(),
            ]
        );
    }

    public function reloadStatusByBooking(IdWebContactMessage $idWebContactMessage)
    {
        return RequestChecker::requestUpdate(
            'CALL sp_web_contact_message_update_status_by_booking(?,@sts,@cod,@msg)',
            [
                $idWebContactMessage->value(),
            ]
        );
    }

    public function updateAlter(WebContactMessage $value)
    {
        return DBRequester::requestUpdate($value);
    }

    public function delete(IdWebContactMessage $id)
    {
        return RequestChecker::requestUpdate(
            'CALL sp_web_contact_message_delete(?,@sts,@cod,@msg)',
            [
                $id->value(),
            ]
        );
    }
}
