<?php

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

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 }}Repository;
use App\Modules\Shared\Domain\Bus\Query\QueryBus;
use App\Modules\Shared\Domain\Transaction;

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

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

        $id = $this->repository->insert($model);
        $model->setId($id);

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

        $this->transaction->commit();
        return $id->value();
    }
}
