<?php

namespace Tests\Feature;

use App\Mcp\Servers\LinkedInServer;
use App\Mcp\Tools\LinkedIn\LinkedInCreateCampaign;
use App\Mcp\Tools\LinkedIn\LinkedInCreateCampaignGroup;
use App\Mcp\Tools\LinkedIn\LinkedInCreateCreative;
use App\Mcp\Tools\LinkedIn\LinkedInGetAdAccounts;
use App\Mcp\Tools\LinkedIn\LinkedInUpdateEntity;
use App\Services\LinkedIn\LinkedInRestApi;
use App\Services\Platforms\Support\CallLogger;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Http;
use Tests\TestCase;

class LinkedInMcpServerTest extends TestCase
{
    use RefreshDatabase;

    protected function setUp(): void
    {
        parent::setUp();

        config([
            'platforms.guardrails.allowed_ad_accounts' => ['509999999', 'urn:li:sponsoredAccount:509999999'],
            'platforms.guardrails.retry_backoff_ms' => 0,
            'platforms.linkedin.token' => 'mock-linkedin-token',
        ]);

        $this->app->scoped(LinkedInRestApi::class, fn (): LinkedInRestApi => new LinkedInRestApi(
            'mock-linkedin-token',
            '202401',
            app(CallLogger::class),
        ));
    }

    public function test_get_ad_accounts_tool(): void
    {
        Http::fake([
            'https://api.linkedin.com/rest/adAccounts*' => Http::response([
                'elements' => [
                    ['id' => 509999999, 'name' => 'AdMedia Corporate Account'],
                ],
            ], 200),
        ]);

        $response = LinkedInServer::tool(LinkedInGetAdAccounts::class);

        $response->assertSee('AdMedia Corporate Account');
    }

    public function test_create_campaign_group_tool(): void
    {
        Http::fake([
            'https://api.linkedin.com/rest/adAccounts/*/adCampaignGroups' => Http::response([], 201, [
                'x-restli-id' => 'urn:li:sponsoredCampaignGroup:12345',
            ]),
        ]);

        $response = LinkedInServer::tool(LinkedInCreateCampaignGroup::class, [
            'ad_account_id' => '509999999',
            'name' => 'Q4 Enterprise Promo',
        ]);

        $response->assertSee('urn:li:sponsoredCampaignGroup:12345');
        $response->assertSee('PAUSED');
    }

    public function test_create_campaign_tool(): void
    {
        Http::fake([
            'https://api.linkedin.com/rest/adAccounts/*/adCampaigns' => Http::response([], 201, [
                'x-restli-id' => 'urn:li:sponsoredCampaign:67890',
            ]),
        ]);

        $response = LinkedInServer::tool(LinkedInCreateCampaign::class, [
            'ad_account_id' => '509999999',
            'campaign_group_id' => '12345',
            'name' => 'Targeted InFeed Promo',
            'objective' => 'WEBSITE_VISITS',
            'daily_budget' => 50.0,
            'cost_type' => 'CPM',
        ]);

        $response->assertSee('urn:li:sponsoredCampaign:67890');
        $response->assertSee('PAUSED');
    }

    public function test_create_creative_tool(): void
    {
        Http::fake([
            'https://api.linkedin.com/rest/adAccounts/*/creatives' => Http::response([], 201, [
                'x-restli-id' => 'urn:li:sponsoredCreative:99887',
            ]),
        ]);

        $response = LinkedInServer::tool(LinkedInCreateCreative::class, [
            'ad_account_id' => '509999999',
            'campaign_id' => '67890',
            'name' => 'Spring Sale Headline',
            'content' => json_encode(['title' => 'Special Offer']),
        ]);

        $response->assertSee('urn:li:sponsoredCreative:99887');
    }

    public function test_update_entity_tool(): void
    {
        Http::fake([
            'https://api.linkedin.com/rest/adAccounts/*/adCampaigns/67890' => Http::response([], 200),
        ]);

        $response = LinkedInServer::tool(LinkedInUpdateEntity::class, [
            'ad_account_id' => '509999999',
            'entity_type' => 'campaign',
            'entity_id' => '67890',
            'fields' => json_encode(['status' => 'ACTIVE']),
        ]);

        $response->assertSee('updated');
        $response->assertSee('67890');
    }
}
