<?php

namespace App\Http\Controllers\Care;

use App\Http\Controllers\Controller;
use App\Http\Controllers\Care\Concerns\ScopesToAccount;
use App\Models\Appointment;
use App\Models\Consultation;
use App\Models\Patient;
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',
            'patients_total' => Patient::owned($owner)->where('organization_id', $organization->id)->count(),
            'appointments_today' => Appointment::owned($owner)
                ->where('organization_id', $organization->id)
                ->whereDate('scheduled_at', today())
                ->count(),
            'queue_waiting' => Appointment::owned($owner)
                ->where('organization_id', $organization->id)
                ->where('status', Appointment::STATUS_WAITING)
                ->count(),
            'in_consultation' => Appointment::owned($owner)
                ->where('organization_id', $organization->id)
                ->where('status', Appointment::STATUS_IN_CONSULTATION)
                ->count(),
            'consultations_completed_today' => Consultation::owned($owner)
                ->whereHas('visit', fn ($q) => $q->where('organization_id', $organization->id))
                ->where('status', Consultation::STATUS_COMPLETED)
                ->whereDate('completed_at', today())
                ->count(),
        ];
    }
}
