<?php

namespace App\Http\Controllers\Api\V1\Admin\Agent;

use App\Models\AgentNode;
use App\Models\AgentProfile;
use App\Support\ApiResponse;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller;
use App\Support\AdminAgentNodeAccess;
use App\Support\AgentNodePresenter;

final class AgentNodeChildrenController extends Controller
{
    public function __invoke(Request $request, AgentNode $agent_node): JsonResponse
    {
        $admin = $request->lotteryAdmin();
        abort_if($admin === null, 401);

        $denied = AdminAgentNodeAccess::denyUnlessNodeVisible($admin, $agent_node);
        if ($denied !== null) {
            return $denied;
        }

        $children = $agent_node->children()->orderBy('code')->get();
        $profiles = AgentProfile::query()
            ->whereIn('agent_node_id', $children->pluck('id'))
            ->get()
            ->keyBy('agent_node_id');

        $items = $children
            ->map(static function (AgentNode $child) use ($profiles): array {
                $profile = $profiles->get($child->id);

                return AgentNodePresenter::item(
                    $child,
                    $profile instanceof AgentProfile ? $profile : null,
                );
            })
            ->all();

        return ApiResponse::success(['items' => $items]);
    }
}
