<?php

use App\Models\User;
use Illuminate\Support\Facades\Storage;
use Modules\Catalog\Models\Destination;
use Modules\Catalog\Models\EvCompany;

beforeEach(function () {
    $this->token = User::factory()->create()->createToken('test-token')->plainTextToken;
});

test('lists active ev companies', function () {
    $active = EvCompany::factory()->create(['is_active' => true]);
    EvCompany::factory()->create(['is_active' => false]);

    $this->withHeader('Authorization', "Bearer {$this->token}")
        ->getJson('/api/v1/companies')
        ->assertSuccessful()
        ->assertJsonCount(1, 'data')
        ->assertJsonFragment(['id' => $active->id]);
});

test('returns the company logo as a full absolute url', function () {
    $company = EvCompany::factory()->create(['is_active' => true, 'logo' => 'logos/example.png']);

    $this->withHeader('Authorization', "Bearer {$this->token}")
        ->getJson('/api/v1/companies')
        ->assertSuccessful()
        ->assertJsonFragment(['logo' => url(Storage::disk('public')->url($company->logo))]);
});

test('returns a null logo when the company has none', function () {
    EvCompany::factory()->create(['is_active' => true, 'logo' => null]);

    $this->withHeader('Authorization', "Bearer {$this->token}")
        ->getJson('/api/v1/companies')
        ->assertSuccessful()
        ->assertJsonFragment(['logo' => null]);
});

test('lists active destinations', function () {
    $active = Destination::factory()->create(['is_active' => true]);
    Destination::factory()->create(['is_active' => false]);

    $this->withHeader('Authorization', "Bearer {$this->token}")
        ->getJson('/api/v1/destinations')
        ->assertSuccessful()
        ->assertJsonCount(1, 'data')
        ->assertJsonFragment(['id' => $active->id]);
});

test('paginates companies and destinations', function () {
    EvCompany::factory()->count(20)->create(['is_active' => true]);
    Destination::factory()->count(20)->create(['is_active' => true]);

    $this->withHeader('Authorization', "Bearer {$this->token}")
        ->getJson('/api/v1/companies')
        ->assertSuccessful()
        ->assertJsonCount(15, 'data')
        ->assertJsonPath('meta.total', 20);

    $this->withHeader('Authorization', "Bearer {$this->token}")
        ->getJson('/api/v1/destinations')
        ->assertSuccessful()
        ->assertJsonCount(15, 'data')
        ->assertJsonPath('meta.total', 20);
});

test('searches destinations by comma-separated terms', function () {
    $yangon = Destination::factory()->create(['is_active' => true, 'name' => 'Yangon']);
    $mandalay = Destination::factory()->create(['is_active' => true, 'name' => 'Mandalay']);
    Destination::factory()->create(['is_active' => true, 'name' => 'Bagan']);

    $this->withHeader('Authorization', "Bearer {$this->token}")
        ->getJson('/api/v1/destinations?search=yangon,mandalay')
        ->assertSuccessful()
        ->assertJsonCount(2, 'data')
        ->assertJsonFragment(['id' => $yangon->id])
        ->assertJsonFragment(['id' => $mandalay->id]);
});

test('companies endpoint rejects unauthenticated requests', function () {
    $this->getJson('/api/v1/companies')->assertUnauthorized();
});

test('destinations endpoint rejects unauthenticated requests', function () {
    $this->getJson('/api/v1/destinations')->assertUnauthorized();
});
