<?php

declare(strict_types=1);

namespace ShlinkioCliTest\Shlink\CLI\Command;

use PHPUnit\Framework\Attributes\Test;
use Shlinkio\Shlink\CLI\Command\ShortUrl\ListShortUrlsCommand;
use Shlinkio\Shlink\Importer\Command\ImportCommand;
use Shlinkio\Shlink\TestUtils\CliTest\CliTestCase;

use function fclose;
use function fopen;
use function fwrite;
use function is_string;
use function sys_get_temp_dir;
use function tempnam;
use function unlink;

class ImportShortUrlsTest extends CliTestCase
{
    private false|string|null $tempCsvFile = null;

    protected function setUp(): void
    {
        $this->tempCsvFile = tempnam(sys_get_temp_dir(), 'shlink_csv');
        if (! $this->tempCsvFile) {
            return;
        }

        $handle = fopen($this->tempCsvFile, 'w+');
        if (! $handle) {
            $this->fail('It was not possible to open the temporary file to write CSV on it');
        }

        fwrite(
            $handle,
            <<<CSV
            longURL;tags;domain;short code;Title
            https://shlink.io;foo,baz;s.test;testing-default-domain-import-1;
            https://example.com;foo;s.test;testing-default-domain-import-2;
            CSV,
        );
        fclose($handle);
    }

    protected function tearDown(): void
    {
        if (is_string($this->tempCsvFile)) {
            unlink($this->tempCsvFile);
        }
    }

    #[Test]
    public function defaultDomainIsIgnoredWhenExplicitlyProvided(): void
    {
        if (! $this->tempCsvFile) {
            $this->fail('It was not possible to create a temporary CSV file');
        }

        [$output] = $this->exec([ImportCommand::NAME, 'csv'], [$this->tempCsvFile, ';']);

        self::assertStringContainsString('https://shlink.io: Imported', $output);
        self::assertStringContainsString('https://example.com: Imported', $output);

        [$listOutput1] = $this->exec(
            [ListShortUrlsCommand::NAME, '--show-domain', '--search-term', 'testing-default-domain-import-1'],
        );
        self::assertStringContainsString('DEFAULT', $listOutput1);
        [$listOutput1] = $this->exec(
            [ListShortUrlsCommand::NAME, '--show-domain', '--search-term', 'testing-default-domain-import-2'],
        );
        self::assertStringContainsString('DEFAULT', $listOutput1);
    }
}