<?php

namespace Tests\Feature;

use App\Agent\Tools\Campaign\ReviewAssets;
use App\Agent\Workspace;
use App\Models\Asset;
use App\Models\Campaign;
use App\Models\TikTokConnection;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Laravel\Ai\Tools\Request;
use Tests\TestCase;

class TikTokReviewAssetsTest extends TestCase
{
    use RefreshDatabase;

    public function test_tiktok_assets_upload_to_tiktok_instead_of_meta(): void
    {
        Storage::fake('public');
        $user = User::factory()->create();
        $this->actingAs($user);
        TikTokConnection::factory()->for($user)->create(['advertiser_id' => 'advertiser-1']);

        $campaign = Campaign::create([
            'user_id' => $user->id,
            'name' => 'TikTok image campaign',
            'platform' => 'tiktok',
            'status' => 'draft',
            'ad_account_id' => 'advertiser-1',
        ]);
        $asset = Asset::create([
            'owner_type' => $user->getMorphClass(),
            'owner_id' => $user->id,
            'kind' => 'image',
            'source' => 'generated',
            'disk' => 'public',
            'path' => 'creatives/images/creative-32.png',
            'original_name' => 'creative-32.png',
            'mime' => 'image/png',
            'bytes' => 3,
            'checksum' => 'tiktok-image',
        ]);
        Storage::disk('public')->put($asset->path, 'png');
        $campaign->ads()->create([
            'headline' => 'Test headline',
            'primary_text' => 'Test copy',
            'cta' => 'LEARN_MORE',
        ]);

        $workspace = app(Workspace::class);
        $workspace->bindTo('tiktok-review-assets');
        $workspace->ownedBy($user);
        $workspace->produced($campaign);
        $workspace->produced($asset, focus: false);

        Http::fake([
            'business-api.tiktok.com/open_api/v1.3/file/image/ad/upload/' => Http::response([
                'code' => 0,
                'data' => ['image_id' => 'tiktok-image-1'],
            ]),
        ]);

        $response = app(ReviewAssets::class)->handle(new Request);
        $payload = json_decode((string) $response, true);

        $this->assertTrue($payload['ok']);
        $this->assertSame('tiktok-image-1', $payload['just_uploaded'][0]['reference']);
        Http::assertSent(fn ($request): bool => str_contains($request->url(), '/open_api/v1.3/file/image/ad/upload/'));
        Http::assertNotSent(fn ($request): bool => str_contains($request->url(), 'graph.facebook.com'));
    }
}