<?php

namespace Zoomyboy\LaravelNami\Tests\Unit;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Http;
use Zoomyboy\LaravelNami\Fakes\SearchFake;
use Zoomyboy\LaravelNami\Group;
use Zoomyboy\LaravelNami\LoginException;
use Zoomyboy\LaravelNami\Member;
use Zoomyboy\LaravelNami\Nami;
use Zoomyboy\LaravelNami\NamiException;
use Zoomyboy\LaravelNami\NamiServiceProvider;
use Zoomyboy\LaravelNami\Tests\TestCase;

class SearchTest extends TestCase
{

    public array $attributes = [
        [
            'firstname' => 'Max',
            'lastname' => 'Nach1',
            'group_id' => 103,
            'nickname' => 'spitz1',
            'gender_id' => 17,
            'id' => 16,
        ], [
            'firstname' => 'Jane',
            'lastname' => 'Nach2',
            'nickname' => null,
            'group_id' => 103,
            'gender_id' => null,
            'id' => 17,
        ]
    ];

    public function dataProvider(): array
    {
        return [
            'firstname' => ['vorname', ['Max', 'Jane']],
        ];
    }

    public function test_find_a_member_by_mglnr(): void
    {
        Http::fake([
            $this->url(['mitgliedsNummber' => 150]) => Http::response($this->fakeJson('searchResponse.json'), 200),
        ]);

        $member = $this->login()->findNr(150);

        $this->assertEquals('Philipp', $member->firstname);
        Http::assertSent(function($request) {
            return $request->url() == $this->url(['mitgliedsNummber' => 150])
                && $request->method() == 'GET';
        });

        Http::assertSentCount(1);
    }

    public function test_it_throws_exception_when_search_fails(): void
    {
        $this->withoutExceptionHandling()->expectException(NamiException::class);
        app(SearchFake::class)->fetchFails($page = 1, $start = 0, 'unknown error');

        $this->login()->search([])->first();
    }

    private function url(array $payload): string
    {
        $payload = rawurlencode(json_encode($payload));

        return "https://nami.dpsg.de/ica/rest/nami/search-multi/result-list?searchedValues={$payload}&page=1&start=0&limit=100";
    }

}