<?php

namespace Tests\Unit;

use App\Campaigns\WhaleAdopsReader;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Tests\TestCase;

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

        config([
            'database.connections.whale' => [
                'driver' => 'sqlite',
                'database' => ':memory:',
                'prefix' => '',
                'foreign_key_constraints' => false,
            ],
        ]);
        DB::purge('whale');

        $schema = Schema::connection('whale');

        $schema->create('arb_adops_campaigns', function (Blueprint $table): void {
            $table->string('platform');
            $table->string('account_id');
            $table->string('campaign_id');
            $table->string('name');
            $table->string('status')->nullable();
            $table->string('effective_status')->nullable();
            $table->decimal('daily_budget', 12, 2)->nullable();
            $table->string('learning_status')->nullable();
            $table->date('start_date')->nullable();
        });

        $schema->create('arb_adops_campaign_performance', function (Blueprint $table): void {
            $table->date('date');
            $table->string('campaign_id');
            $table->unsignedInteger('clicks')->default(0);
            $table->decimal('sum_cpc', 12, 4)->default(0);
            $table->decimal('orders', 12, 4)->default(0);
            $table->decimal('net_revenue', 12, 4)->default(0);
        });

        $schema->create('roi_dashboard_campaign_stats', function (Blueprint $table): void {
            $table->date('date');
            $table->string('platform');
            $table->string('campaign_id');
            $table->string('campaign_name')->nullable();
        });
    }

    public function test_roi_campaigns_are_added_and_existing_ids_keep_adops_or_performance_identity(): void
    {
        DB::connection('whale')->table('arb_adops_campaigns')->insert([
            'platform' => 'meta',
            'account_id' => 'act_1',
            'campaign_id' => '111',
            'name' => 'From Adops',
            'status' => 'ACTIVE',
            'effective_status' => 'ACTIVE',
            'daily_budget' => 20,
            'learning_status' => null,
            'start_date' => '2026-09-01',
        ]);

        DB::connection('whale')->table('arb_adops_campaign_performance')->insert([
            ['date' => '2026-09-19', 'campaign_id' => '111', 'clicks' => 1, 'sum_cpc' => 0.1, 'orders' => 1, 'net_revenue' => 10],
            ['date' => '2026-09-19', 'campaign_id' => '222', 'clicks' => 2, 'sum_cpc' => 0.2, 'orders' => 2, 'net_revenue' => 20],
        ]);

        DB::connection('whale')->table('roi_dashboard_campaign_stats')->insert([
            ['date' => '2026-09-19', 'platform' => 'Meta', 'campaign_id' => '111', 'campaign_name' => 'ROI should not replace adops'],
            ['date' => '2026-09-19', 'platform' => 'meta', 'campaign_id' => '222', 'campaign_name' => 'ROI should not replace performance'],
            ['date' => '2026-09-18', 'platform' => 'meta', 'campaign_id' => '333', 'campaign_name' => 'ROI only'],
            ['date' => '2026-09-18', 'platform' => 'Google', 'campaign_id' => '444', 'campaign_name' => 'Google only'],
        ]);

        $rows = collect(app(WhaleAdopsReader::class)->campaigns('meta'))->keyBy('campaign_id');

        $this->assertSame('From Adops', $rows['111']['name']);
        $this->assertSame('meta', $rows['111']['platform']);
        $this->assertSame('Campaign 222', $rows['222']['name']);
        $this->assertSame('ROI only', $rows['333']['name']);
        $this->assertArrayNotHasKey('444', $rows->all());
    }
}
