<?php

namespace Tests\Feature;

use App\Campaigns\Targeting\CountryLookup;
use App\Services\GoogleAdsService;
use App\Services\LinkedIn\LinkedInRestApi;
use App\Services\Meta\GraphApi;
use Mockery;
use Tests\TestCase;

class CountryLookupTest extends TestCase
{
    public function test_linkedin_does_not_confuse_california_with_canada(): void
    {
        $linkedin = Mockery::mock(LinkedInRestApi::class);
        $linkedin->shouldReceive('countryCandidates')->once()->with('Canada', '123')->andReturn([
            ['urn' => 'urn:li:geo:102095887', 'name' => 'California, United States'],
        ]);

        $lookup = new CountryLookup(
            Mockery::mock(GoogleAdsService::class),
            $linkedin,
            Mockery::mock(GraphApi::class),
        );

        $this->assertNull($lookup->find('linkedin', 'CA', 'Canada', '123'));
    }

    public function test_linkedin_accepts_only_one_exact_geo_match(): void
    {
        $linkedin = Mockery::mock(LinkedInRestApi::class);
        $linkedin->shouldReceive('countryCandidates')->once()->andReturn([
            ['urn' => 'urn:li:country:ca', 'name' => 'Canada'],
            ['urn' => 'urn:li:geo:123', 'name' => 'Canada'],
        ]);

        $lookup = new CountryLookup(
            Mockery::mock(GoogleAdsService::class),
            $linkedin,
            Mockery::mock(GraphApi::class),
        );

        $this->assertSame(['id' => 'urn:li:geo:123', 'name' => 'Canada'], $lookup->find('linkedin', 'CA', 'Canada'));
    }

    public function test_meta_requires_the_exact_country_code_and_type(): void
    {
        $meta = Mockery::mock(GraphApi::class);
        $meta->shouldReceive('countryCandidates')->once()->with('France', 'act_123')->andReturn([
            ['key' => 'FR', 'type' => 'city', 'name' => 'Paris'],
            ['key' => 'FR', 'type' => 'country', 'name' => 'France'],
        ]);

        $lookup = new CountryLookup(
            Mockery::mock(GoogleAdsService::class),
            Mockery::mock(LinkedInRestApi::class),
            $meta,
        );

        $this->assertSame(['id' => 'FR', 'name' => 'France'], $lookup->find('meta', 'FR', 'France', 'act_123'));
    }
}
