<?php

namespace App\Modules\{{ module }}\Application\Update;

use App\Http\History\HistoryTables;
use App\Modules\History\Application\Insert\InsertHistoryQuery;
use App\Modules\History\Domain\HistoryOperation;
use App\Modules\{{ module }}\Domain\{{ module }};
use App\Modules\{{ module }}\Domain\{{ module }}DateUpdate;
use App\Modules\{{ module }}\Domain\{{ module }}Repository;
use App\Modules\{{ module }}\Domain\Index{{ module }};
use App\Modules\Shared\Domain\Bus\Query\QueryBus;
use App\Modules\Shared\Domain\Transaction;

final class {{ module }}Updater
{
    public function __construct(
        private {{ module }}Repository $repository,
        private QueryBus $queryBus,
        private Transaction $transaction,
    ) {}

    public function __invoke({{ module }} $model, int $idAdmin): void
    {
        $this->transaction->begin();

        $first = $this->repository->find(new Index{{ module }}($model->id()));
        $model->setDateUpdate({{ module }}DateUpdate::nowPeru());
        $this->repository->updatePartial($model);

        $this->queryBus->ask(new InsertHistoryQuery(
            json_encode([$first->toArray()]),
            json_encode([$model->toArray()]),
            HistoryOperation::UPDATE,
            $model->id()->value(),
            $model->id()->value(),
            HistoryTables::{{ const }},
            $idAdmin,
        ));

        $this->transaction->commit();
    }
}
