<?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 Google Ads YouTube video asset from an existing YouTube video ID. Use the returned resource name in a Performance Max campaign.')]
class CreateVideoAsset extends Tool
{
    public function __construct(private readonly GoogleAdsService $googleAds) {}

    public function schema(JsonSchema $schema): array
    {
        return [
            'video_id' => $schema->string()->description('The 11-character YouTube video ID')->required(),
            'name' => $schema->string()->description('Optional Google Ads asset name'),
        ];
    }

    public function handle(Request $request): Response
    {
        $user = $request->user();
        if ($user === null) {
            return Response::error('Authentication is required.');
        }

        $data = $request->validate([
            'video_id' => ['required', 'string', 'regex:/^[A-Za-z0-9_-]{11}$/'],
            'name' => ['nullable', 'string', 'max:255'],
        ]);
        $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 {
            $resource = $this->googleAds->createYouTubeVideoAsset($connection, $data['video_id'], $data['name'] ?? null);
        } catch (Throwable $exception) {
            report($exception);

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

        return Response::json([
            'ok' => true,
            'video_id' => $data['video_id'],
            'asset_resource_name' => $resource,
            'next_step' => 'Pass asset_resource_name as youtube_video_assets when creating a Performance Max campaign.',
        ]);
    }
}
