<?php

namespace Tests\Unit\AdOps;

use App\Services\AdOps\CreativeCsv;
use PHPUnit\Framework\TestCase;

final class CreativeCsvTest extends TestCase
{
    public function testEmptyCampaignsColumnIsOmittedNotBlankElement(): void
    {
        // Regression: explode(',', '') produced [''], sending
        // {"campaigns":[""]} and overwriting existing campaign associations.
        $payload = CreativeCsv::decodeRow(['name' => 'X', 'campaigns' => '']);

        $this->assertArrayNotHasKey('campaigns', $payload);
    }

    public function testCampaignsColumnTrimsAndFilters(): void
    {
        $payload = CreativeCsv::decodeRow(['name' => 'X', 'campaigns' => '1, 2 ,,  ,3']);

        $this->assertSame(['1', '2', '3'], $payload['campaigns']);
    }

    public function testRoundTripPreservesCoreFields(): void
    {
        $original = [
            'id'          => 42,
            'name'        => 'banner-A',
            'type'        => 'display',
            'status'      => 'A',
            'campaigns'   => ['10', '20'],
            'destination' => 'https://example.com',
            'size'        => '300x250',
        ];

        $encoded = CreativeCsv::encodeRow((object) $original);
        $decoded = CreativeCsv::decodeRow($encoded);

        $this->assertSame('banner-A', $decoded['name']);
        $this->assertSame('display', $decoded['type']);
        $this->assertSame(['10', '20'], $decoded['campaigns']);
    }

    public function testDestinationStripsWhitespaceAndNonPrintable(): void
    {
        $payload = CreativeCsv::decodeRow([
            'destination' => " https://example.com/path\x00\x07?q=1 ",
        ]);

        $this->assertSame('https://example.com/path?q=1', $payload['destination']);
    }
}
