<?php

namespace App\Mcp\Tools\TikTok;

use App\Models\TikTokConnection;
use App\Services\TikTokService;
use Illuminate\Contracts\JsonSchema\JsonSchema;
use Illuminate\Http\Request as HttpRequest;
use Laravel\Ai\Models\Conversation;
use Laravel\Mcp\Request;
use Laravel\Mcp\Response;
use Laravel\Mcp\Server\Attributes\Description;
use Laravel\Mcp\Server\Tool;

#[Description('Finalize a created TikTok campaign as publish, keep paused, or edit.')]
class FinalizeTikTokCampaign extends Tool
{
    public function __construct(
        private readonly HttpRequest $httpRequest,
        private readonly TikTokService $tiktok,
    ) {}

    public function schema(JsonSchema $schema): array
    {
        return [
            'conversation_id' => $schema->string()->required(),
            'action' => $schema->string()->description('publish, keep_paused, or edit')->required(),
        ];
    }

    public function handle(Request $request): Response
    {
        $data = $request->validate([
            'conversation_id' => ['required', 'string', 'max:36'],
            'action' => ['required', 'in:publish,keep_paused,edit'],
        ]);
        $user = $request->user();
        $conversation = Conversation::query()
            ->whereKey($data['conversation_id'])
            ->where('chat_type', 'tiktok_ads')
            ->where('participant_type', $user?->getMorphClass())
            ->where('participant_id', $user?->getKey())
            ->first();

        if ($user === null || $conversation === null) {
            return Response::error('TikTok chat conversation not found.');
        }

        $draft = json_decode((string) $conversation->tiktok_campaign_draft, true);
        $draft = is_array($draft) ? $draft : [];
        if (blank($draft['created_campaign_id'] ?? null) || blank($draft['created_adgroup_id'] ?? null) || blank($draft['created_ad_id'] ?? null)) {
            return Response::error('Create the TikTok campaign as paused before finalizing it.');
        }

        if ($data['action'] === 'publish') {
            $connection = TikTokConnection::query()->where('user_id', $user->getAuthIdentifier())->first();
            if ($connection === null || blank($connection->access_token) || blank($connection->advertiser_id)) {
                return Response::error('TikTok authorization is required before publishing.');
            }
            try {
                $this->tiktok->updateCampaignStatus($connection, (string) $draft['created_campaign_id'], 'ENABLE');
            } catch (\Throwable $exception) {
                report($exception);

                return Response::error($exception->getMessage());
            }
            $draft['publish_action'] = 'publish';
            $draft['api_status'] = 'enabled';
            $conversation->update(['tiktok_campaign_draft' => json_encode($draft)]);

            return Response::json([
                'ok' => true,
                'action' => 'publish',
                'api_status' => 'enabled',
                'campaign_id' => $draft['created_campaign_id'],
            ]);
        }

        $draft['publish_action'] = $data['action'];
        if ($data['action'] === 'edit') {
            unset($draft['preview_confirmed'], $draft['create_confirmed'], $draft['created_campaign_id'], $draft['created_adgroup_id'], $draft['created_ad_id'], $draft['api_status']);
        }
        $conversation->update(['tiktok_campaign_draft' => json_encode($draft)]);

        return Response::json([
            'ok' => true,
            'action' => $data['action'],
            'api_status' => $data['action'] === 'keep_paused' ? 'paused' : 'editing',
            'campaign_id' => $draft['created_campaign_id'] ?? null,
            'next' => $data['action'] === 'edit' ? 'preview_confirmed' : null,
        ]);
    }
}
