<?php

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

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

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

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

        /** @var {{ module }} $index */
        $index = $this->repository->find(new Index{{ module }}($id));
        $lastData = $index->toArray();

        $index->delete();
        $this->repository->updatePartial($index);

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

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