<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\Feature\Concerns\BuildsFeatureData;
use Tests\TestCase;

class AdminApplicationsFeatureTest extends TestCase
{
    use BuildsFeatureData;
    use DatabaseTransactions;

    private function loginAsAdmin(): void
    {
        $this->actingAs($this->createAdminUser());
    }

    public function test_admin_can_open_applications_index_and_show_page(): void
    {
        $this->loginAsAdmin();

        $applicant = $this->createApplicant();
        $job = $this->createJob();
        $this->createStage($job, ['stage_number' => 1]);
        $application = $this->createJobApplication($applicant, $job);

        $this->get(route('admin.applications.index'))->assertOk();
        $this->get(route('admin.applications.show', $application))->assertOk();
    }

    public function test_admin_can_update_application_status(): void
    {
        $this->loginAsAdmin();

        $applicant = $this->createApplicant();
        $job = $this->createJob();
        $this->createStage($job, ['stage_number' => 1]);
        $application = $this->createJobApplication($applicant, $job);

        $response = $this->patch(route('admin.applications.status', $application), [
            'status' => 'stage1_passed',
            'admin_notes' => 'Lolos seleksi tahap awal.',
        ]);

        $response->assertRedirect(route('admin.applications.show', $application));
        $this->assertDatabaseHas('applications', [
            'id' => $application->id,
            'status' => 'stage1_passed',
            'current_stage' => 1,
            'admin_notes' => 'Lolos seleksi tahap awal.',
        ]);
    }

    public function test_admin_can_bulk_update_application_status(): void
    {
        $this->loginAsAdmin();

        $applicantA = $this->createApplicant(['email' => 'bulk.a@example.com']);
        $applicantB = $this->createApplicant(['email' => 'bulk.b@example.com']);
        $job = $this->createJob();

        $applicationA = $this->createJobApplication($applicantA, $job);
        $applicationB = $this->createJobApplication($applicantB, $job);

        $response = $this->post(route('admin.applications.bulk'), [
            'application_ids' => [$applicationA->id, $applicationB->id],
            'status' => 'rejected',
        ]);

        $response->assertRedirect(route('admin.applications.index'));
        $this->assertDatabaseHas('applications', [
            'id' => $applicationA->id,
            'status' => 'rejected',
        ]);
        $this->assertDatabaseHas('applications', [
            'id' => $applicationB->id,
            'status' => 'rejected',
        ]);
    }

    public function test_admin_can_view_applicants_and_download_data(): void
    {
        $this->loginAsAdmin();

        $this->createApplicant(['email' => 'download.one@example.com']);
        $this->createApplicant(['email' => 'download.two@example.com']);

        $this->get(route('admin.applicants'))->assertOk();

        $csvResponse = $this->get(route('admin.applicants.download', ['format' => 'csv']));
        $csvResponse->assertOk();
        $this->assertStringContainsString('text/csv', (string) $csvResponse->headers->get('content-type'));

        $txtResponse = $this->get(route('admin.applicants.download', ['format' => 'txt']));
        $txtResponse->assertOk();
        $this->assertStringContainsString('text/plain', (string) $txtResponse->headers->get('content-type'));
    }
}
