<?php

namespace App\Mcp\Tools\Performance;

use App\Campaigns\CampaignPerformanceAdopsMonitor;
use App\Campaigns\WhaleAdopsReader;
use App\Models\CampaignPerformanceSuggestion;
use Illuminate\Contracts\JsonSchema\JsonSchema;
use Laravel\Mcp\Request;
use Laravel\Mcp\Response;
use Laravel\Mcp\Server\Attributes\Description;
use Laravel\Mcp\Server\Attributes\Name;
use Laravel\Mcp\Server\Tool;

#[Name('campaign_health')]
#[Description('How a campaign is doing, whether to pause it, and why. Uses Whale spend/clicks (no affiliate CPC or conversions yet). Copy numbers from the tool; do not invent them.')]
class CampaignHealth extends Tool
{
    public function __construct(
        private readonly WhaleAdopsReader $adops,
        private readonly CampaignPerformanceAdopsMonitor $monitor,
    ) {}

    public function schema(JsonSchema $schema): array
    {
        return [
            'campaign_id' => $schema->string()
                ->description('Platform campaign id from find_campaign.')
                ->required(),
            'platform' => $schema->string()
                ->description('meta, google, or linkedin. Defaults to meta.'),
        ];
    }

    public function handle(Request $request): Response
    {
        if (! $this->adops->isAvailable()) {
            return Response::error('Whale adops tables are not available.');
        }

        $campaignId = trim((string) $request->get('campaign_id', ''));
        $platform = strtolower(trim((string) $request->get('platform', 'meta'))) ?: 'meta';

        if ($campaignId === '') {
            return Response::error('campaign_id is required. Call find_campaign first.');
        }

        if ($platform !== 'meta') {
            return Response::text(json_encode([
                'ok' => false,
                'platform' => $platform,
                'message' => 'Only Meta campaign data is in Whale so far.',
            ], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
        }

        $health = $this->monitor->health($platform, $campaignId);

        if ($health === null) {
            return Response::error('No Whale campaign found for that id.');
        }

        $suggestion = CampaignPerformanceSuggestion::query()
            ->where('platform', $platform)
            ->where('external_campaign_id', $campaignId)
            ->first();

        $snapshot = $health['snapshot'];
        $evaluation = $health['evaluation'];

        return Response::text(json_encode([
            'ok' => true,
            'campaign' => $health['campaign']['name'],
            'platform' => $platform,
            'campaign_id' => $campaignId,
            'account_id' => $health['campaign']['account_id'],
            'platform_status' => $health['campaign']['effective_status'] ?? $health['campaign']['status'],
            'verdict' => $evaluation['final_verdict'],
            'reason' => $evaluation['final_reason'],
            'hourly_verdict' => $evaluation['hourly_verdict'],
            'last_saved_reason' => $suggestion?->reason,
            'last_saved_at' => $suggestion?->suggested_at?->toDateTimeString(),
            'last_7_hours' => $snapshot['last_7_hours'] ?? null,
            'last_7_days' => $snapshot['last_7_days'] ?? null,
            'yesterday' => $snapshot['yesterday'] ?? null,
            'trend' => $snapshot['trend'] ?? null,
            'trend_summary' => $snapshot['trend_summary'] ?? null,
            'sync_failed' => $snapshot['sync_failed'] ?? false,
            'sync_error' => $snapshot['sync_error'] ?? null,
            'revenue_included' => false,
            'note' => 'Affiliate CPC, commissions, and conversions are not in Whale yet. Verdicts use platform spend, impressions, and clicks only.',
        ], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
    }
}
