<?php

namespace App\Http\Controllers\Meet;

use App\Http\Controllers\Controller;
use App\Http\Controllers\Meet\Concerns\ScopesToAccount;
use App\Models\Member;
use App\Models\Recording;
use App\Models\Room;
use App\Services\Afia\AfiaService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class AiController extends Controller
{
    use ScopesToAccount;

    public function chat(Request $request, AfiaService $afia): JsonResponse
    {
        $validated = $request->validate([
            'message' => ['required', 'string', 'max:2000'],
            'history' => ['nullable', 'array', 'max:20'],
            'history.*.role' => ['nullable', 'string'],
            'history.*.text' => ['nullable', 'string'],
        ]);

        if (! $afia->enabled()) {
            return response()->json(['message' => 'Afia is not available right now.'], 503);
        }

        try {
            $reply = $afia->chat(trim($validated['message']), $validated['history'] ?? [], $this->context($request));
        } catch (\Throwable $e) {
            report($e);

            return response()->json(['message' => 'Afia could not respond right now. Please try again.'], 502);
        }

        return response()->json(['reply' => $reply]);
    }

    /** @return array<string, mixed> */
    private function context(Request $request): array
    {
        $owner = $this->ownerRef($request);
        $organization = $this->organization($request);

        return [
            'signed_in' => 'yes',
            'organization' => $organization->name,
            'meetings_total' => Room::owned($owner)->where('organization_id', $organization->id)->count(),
            'meetings_upcoming' => Room::owned($owner)
                ->where('organization_id', $organization->id)
                ->where('status', 'scheduled')
                ->where('scheduled_at', '>=', now())
                ->count(),
            'recordings_total' => Recording::owned($owner)
                ->whereHas('session.room', fn ($q) => $q->where('organization_id', $organization->id))
                ->count(),
            'team_members' => Member::owned($owner)->where('organization_id', $organization->id)->count(),
        ];
    }
}
