<?php

namespace Tests\Feature;

use App\Http\Controllers\ClientController;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use PHPUnit\Framework\Attributes\DataProvider;
use Tests\TestCase;

class ClientAccountOpeningDocumentsTest extends TestCase
{
    protected function setUp(): void
    {
        parent::setUp();

        Schema::create('account_types', function (Blueprint $table) {
            $table->id();
            $table->string('type_name');
        });

        DB::table('account_types')->insert([
            ['id' => 1, 'type_name' => 'Individual'],
            ['id' => 2, 'type_name' => 'Joint'],
            ['id' => 3, 'type_name' => 'Corporate'],
            ['id' => 4, 'type_name' => 'Trust'],
        ]);
    }

    #[DataProvider('requiredDocumentsProvider')]
    public function test_account_type_requires_its_opening_documents(int $accountType, array $requiredDocuments): void
    {
        $response = app(ClientController::class)->store(
            Request::create('/clients', 'POST', ['account_type' => $accountType])
        );

        $errors = $response->getData(true)['errors'];

        foreach ($requiredDocuments as $document) {
            $this->assertArrayHasKey($document, $errors);
            $this->assertArrayHasKey($document . '_verified', $errors);
        }
    }

    #[DataProvider('requiredDocumentsProvider')]
    public function test_valid_uploads_and_confirmations_pass_document_validation(int $accountType, array $requiredDocuments): void
    {
        $parameters = ['account_type' => $accountType];
        $files = [];

        foreach ($requiredDocuments as $document) {
            $parameters[$document . '_verified'] = '1';
            $files[$document] = UploadedFile::fake()->create($document . '.pdf', 100, 'application/pdf');
        }

        $request = Request::create('/clients', 'POST', $parameters, [], $files);
        $response = app(ClientController::class)->store($request);
        $errors = $response->getData(true)['errors'];

        foreach ($requiredDocuments as $document) {
            $this->assertArrayNotHasKey($document, $errors);
            $this->assertArrayNotHasKey($document . '_verified', $errors);
        }
    }

    public function test_individual_account_does_not_require_opening_documents(): void
    {
        $response = app(ClientController::class)->store(
            Request::create('/clients', 'POST', ['account_type' => 1])
        );

        $errors = $response->getData(true)['errors'];

        foreach (['joint_consent_form', 'ssm_document', 'board_resolution', 'agm_document', 'ros_approval'] as $document) {
            $this->assertArrayNotHasKey($document, $errors);
            $this->assertArrayNotHasKey($document . '_verified', $errors);
        }
    }

    public static function requiredDocumentsProvider(): array
    {
        return [
            'joint' => [2, ['joint_consent_form']],
            'corporate' => [3, ['ssm_document', 'board_resolution']],
            'trust' => [4, ['agm_document', 'ros_approval']],
        ];
    }
}
