<?php

namespace App\Mcp\Tools\GoogleAds;

use App\Models\GoogleAdsConnection;
use App\Services\GoogleAdsService;
use Illuminate\Contracts\JsonSchema\JsonSchema;
use Laravel\Mcp\Request;
use Laravel\Mcp\Response;
use Laravel\Mcp\Server\Attributes\Description;
use Laravel\Mcp\Server\Tool;
use Throwable;

#[Description('Create a paused responsive search ad under an existing Google Ads ad group.')]
class CreateResponsiveSearchAd extends Tool
{
    public function __construct(private readonly GoogleAdsService $googleAds) {}

    public function schema(JsonSchema $schema): array
    {
        return ['ad_group_resource_name' => $schema->string()->required(), 'final_url' => $schema->string()->required(), 'headlines' => $schema->array()->description('Three to fifteen headlines, maximum 30 characters each')->required(), 'descriptions' => $schema->array()->description('Two to four descriptions, maximum 90 characters each')->required()];
    }

    public function handle(Request $request): Response
    {
        $user = $request->user();
        if ($user === null) {
            return Response::error('Authentication is required.');
        }
        $data = $request->validate(['ad_group_resource_name' => ['required', 'string'], 'final_url' => ['required', 'url'], 'headlines' => ['required', 'array', 'min:3', 'max:15'], 'headlines.*' => ['string', 'max:30'], 'descriptions' => ['required', 'array', 'min:2', 'max:4'], 'descriptions.*' => ['string', 'max:90']]);
        $connection = GoogleAdsConnection::query()->where('user_id', $user->getAuthIdentifier())->first();
        if ($connection === null || blank($connection->customer_id)) {
            return Response::error('Select a child Google Ads account first.');
        }
        try {
            return Response::json(['ok' => true, 'ad_resource_name' => $this->googleAds->createResponsiveSearchAd($connection, $data['ad_group_resource_name'], $data['final_url'], $data['headlines'], $data['descriptions'])]);
        } catch (Throwable $exception) {
            report($exception);

            return Response::error($exception->getMessage());
        }
    }
}
