<?php

namespace App\Mcp\Tools\Performance;

use App\Campaigns\PerformanceVerdict;
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('portfolio_summary')]
#[Description('What to look at across Meta campaigns today: pause, stop, action required, then the rest. Uses the latest hourly analysis when it has run.')]
class PortfolioSummary extends Tool
{
    public function __construct(private readonly WhaleAdopsReader $adops) {}

    public function schema(JsonSchema $schema): array
    {
        return [
            'limit' => $schema->integer()
                ->description('Max campaigns to return. Defaults to 25.'),
        ];
    }

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

        $limit = (int) $request->get('limit', 25);
        $limit = $limit > 0 ? min($limit, 100) : 25;
        $since = now()->subDays(6)->toDateString();
        $totals = $this->adops->sevenDayTotals('meta', $since);

        $suggestions = CampaignPerformanceSuggestion::query()
            ->where('platform', 'meta')
            ->orderByDesc('suggested_at')
            ->get()
            ->unique('external_campaign_id')
            ->values();

        $ranked = $suggestions
            ->sortBy(function (CampaignPerformanceSuggestion $row): int {
                return PerformanceVerdict::tryFromStored($row->status)?->priority() ?? 99;
            })
            ->take($limit)
            ->map(function (CampaignPerformanceSuggestion $row) use ($totals): array {
                $id = (string) $row->external_campaign_id;
                $seven = $totals[$id] ?? ['spend' => 0.0, 'clicks' => 0, 'impressions' => 0];

                return [
                    'campaign' => data_get($row->snapshot, 'campaign', 'Campaign '.$id),
                    'campaign_id' => $id,
                    'verdict' => $row->status,
                    'reason' => $row->reason,
                    'spend_7d' => $seven['spend'],
                    'clicks_7d' => $seven['clicks'],
                    'suggested_at' => $row->suggested_at?->toDateTimeString(),
                ];
            })
            ->values()
            ->all();

        $counts = [];
        foreach (PerformanceVerdict::cases() as $verdict) {
            $counts[$verdict->value] = $suggestions->where('status', $verdict->value)->count();
        }

        return Response::text(json_encode([
            'ok' => true,
            'platform' => 'meta',
            'campaigns_analysed' => $suggestions->count(),
            'verdict_counts' => $counts,
            'attention' => $ranked,
            'revenue_included' => false,
            'note' => $suggestions->isEmpty()
                ? 'No hourly analysis yet. Run php artisan campaigns:monitor-adops --hourly after Whale has Meta rows.'
                : 'Affiliate CPC and conversions are not included yet.',
        ], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
    }
}
