<?php

namespace App\Actions\Sales;

use Exception;
use App\Actions\Transactions\CreateRecordTransactionsAction;
use App\Commands\Sales\CreateSaleCommand;
use App\Commands\Series\CreateSeriesCommand;
use App\Models\Sale;
use Illuminate\Support\Facades\DB;

class CreateSaleAction
{
    /**
     * Create a new class instance.
     */
    public function __construct(
        private CreateSaleCommand $createSaleCommand,
        private CreateSeriesCommand $createSeriesCommand,
    ){ }

    public function __invoke(array $data, array $transactions): Sale
    {
        $record = $this->createSaleCommand->execute($data);
        
         try {
            DB::beginTransaction();
            //create transactions for the sale
            app(CreateRecordTransactionsAction::class)($record, $transactions);

            $accountIds = collect($transactions)
                ->pluck('account_id')
                ->filter()
                ->unique()
                ->values()
                ->all();

            //sync accounts to sale
            app(SyncAccountsAction::class)($record, $accountIds);

            //increment current_series
            $this->createSeriesCommand->execute([
                'branch_id' => $record->branch_id,
                'series' => $record->reference_number,
            ]);

            DB::commit();
        } catch (Exception $exception) {
            DB::rollBack();
            throw new Exception('Failed to save transactions : '.$exception->getMessage());
        }

       return $record;
    }
}
