<?php

namespace App\Filament\Resources\Expenses\Pages;

use App\Actions\Transactions\CreateRecordTransactionsAction;
use App\Filament\Resources\Clients\ClientResource;
use App\Filament\Resources\Expenses\ExpenseResource;
use App\Models\Client;
use Exception;
use Filament\Resources\Pages\CreateRecord;
use Illuminate\Support\Arr;
use Symfony\Component\Console\Exception\LogicException;

class CreateExpense extends CreateRecord
{
    protected static string $resource = ExpenseResource::class;

    public ?int $clientId = null;

    public function mount(): void
    {
        parent::mount();

        $this->clientId = request()->integer('client_id');
    }

    public function getBreadcrumbs(): array
    {
        $client = $this->getClient();

        if (! $client) {
            return parent::getBreadcrumbs();
        }

        return [
            ClientResource::getUrl('view', ['record' => $client->id]) => $client->company,
            ClientResource::getUrl('view', ['record' => $client->id]).'?activeRelationManager=4' => 'Expenses',
            $this->getResource()::getUrl('create', ['client_id' => $client->id]) => 'Create',
        ];
    }

    protected function getClient(): Client|null
    {
        if (! $this->clientId) {
            return null;
        }

        return Client::find($this->clientId);
    }

    protected function mutateFormDataBeforeCreate(array $data): array
    {

        return $this->getFormDataMutation($data);
    }

    public function getFormDataMutation(array $data): array
    {
        $transactions = $data['transactions'] ?? [];

        $data['gross_amount'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['gross_amount'] ?? 0));
        $data['exempt'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['exempt'] ?? 0));
        $data['zero_rated'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['zero_rated'] ?? 0));
        $data['vatable_amount'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['vatable_amount'] ?? 0));
        $data['input_tax'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['input_tax'] ?? 0));
        $data['payable_withholding_tax'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['payable_withholding_tax'] ?? 0));
        $data['net_amount'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['net_amount'] ?? 0));

        return Arr::except($data, ['client', 'transactions']);
    }

    protected function afterCreate(): void
    {
        $transactions = $this->form->getState()['transactions'] ?? [];

        try {
            app(CreateRecordTransactionsAction::class)($this->getRecord(), $transactions);

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

            $this->getRecord()->accounts()->sync($accountIds);

            $this->commitDatabaseTransaction();
        } catch (Exception $exception) {
            $this->rollBackDatabaseTransaction();
            throw new LogicException('Failed to save transactions : '.$exception->getMessage());
        }
    }
}
