<?php

namespace App\Classes\Modules\Anthropic\Services;


use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Exceptions\ConnectionErrorException;
use Illuminate\Support\Facades\Log;

class CreatesClaudeResponse
{
    /**
     * @param string $userPrompt
     * @param string $model
     * @return null|object
     * @throws MalformedRequestException
     */
    public function execute(string $userPrompt, string $model = "") {
        try {
            // Default to the latest recommended Claude model
            $modelId = $model ?? config('anthropic.default_model', 'claude-sonnet-4-5-20250929');

            $data = [
                'model' => $modelId,
                'messages' => [
                    [
                        'role' => 'user',
                        'content' => $userPrompt
                    ]
                ]
            ];

            $response = Http::withHeaders([
                'x-api-key' => config('anthropic.api_key'),
                'anthropic-version' => config('anthropic.api_version', '2023-06-01'),
            ])->post(config('anthropic.base_url') . '/v1/messages', $data);

            if ($response->successful()) {
                return (object) $response->json();
            } else {
                Log::info('CreatesClaudeResponse error: ' . $response->body());
                return null;
            }
        }
        catch (\Illuminate\Http\Client\ConnectionException $exception) {
            Log::info('ConnectionException' . json_encode($exception));
            throw new ConnectionErrorException(
                'Failed to connect to Claude API',
                $exception->getMessage(),
                $userPrompt,
                $exception->getTraceAsString()
            );
        }
        catch (\Exception $exception) {
            Log::info('Exception' . json_encode($exception));
            throw new MalformedRequestException(
                'Unable to get correct response from Claude API: ' . $exception->getMessage()
            );
        }
    }
}
