<?php

namespace App\Initialize;

use App\Member\Actions\InsertFullMemberAction;
use Log;
use App\Member\Data\FullMember;
use App\Member\Member;
use App\Nami\Api\FullMemberAction;
use App\Setting\NamiSettings;
use Illuminate\Support\Facades\Bus;
use Illuminate\Support\Facades\Redis;
use Lorisleiva\Actions\Concerns\AsAction;
use Zoomyboy\LaravelNami\Api;
use Zoomyboy\LaravelNami\Data\MemberEntry as NamiMemberEntry;

class InitializeMembers
{
    use AsAction;

    public string $commandSignature = 'member:pull';
    public string $jobQueue = 'long';

    public function handle(Api $api): void
    {
        $settings = app(NamiSettings::class);
        Redis::delete('members');

        $memberIds = $api->search($settings->search_params)->map(fn ($member) => $member->id)->toArray();
        foreach (Member::remote()->whereNotIn('nami_id', $memberIds)->get() as $member) {
            if ($member->efz !== null || $member->ps_at !== null  || $member->more_ps_at !== null) {
                Log::error('Mitglied ' . $member->id . ' wird nicht gelöscht werden.');
                continue;
            }
            $member->delete();
        }

        $jobs = $api->search($settings->search_params)->map(function (NamiMemberEntry $member) use ($api) {
            return FullMemberAction::makeJob($api, $member->groupId, $member->id, 'members');
        })->toArray();

        Bus::batch($jobs)
            ->finally(function () {
                /** @var array<int, FullMember> */
                $members = array_map(fn ($member) => FullMember::from(json_decode($member, true)), Redis::lrange('members', 0, -1));

                foreach ($members as $data) {
                    InsertFullMemberAction::dispatch($data);
                }
            })
            ->onQueue('long')
            ->allowFailures()
            ->dispatch();
    }

    public function asCommand(): int
    {
        $this->handle(app(NamiSettings::class)->login());

        return 0;
    }
}