<?php

namespace App\Library\CampaignDecision;

use App\Campaigns\PerformanceDay;
use App\Campaigns\PerformanceHour;
use Illuminate\Support\Collection;

class CampaignDataQualityValidator
{
    /**
     * @param  Collection<int, PerformanceDay>  $days
     * @param  Collection<int, PerformanceHour>  $hours
     * @param  array<string, mixed>  $affiliate
     * @return array<string, bool>
     */
    public function capabilities(Collection $days, Collection $hours, array $affiliate, bool $syncFailed): array
    {
        $hasHours = $hours->isNotEmpty();
        $hasDays = $days->isNotEmpty();

        return [
            'platform_metrics_available' => $hasHours || $hasDays,
            'platform_conversions_available' => false,
            'internal_revenue_available' => ($affiliate['matched'] ?? false) === true,
            'internal_orders_available' => ($affiliate['matched'] ?? false) === true
                && (float) ($affiliate['outcome_window']['orders'] ?? 0) > 0,
            'campaign_mapping_ok' => true,
            'ingest_healthy' => ! $syncFailed,
        ];
    }

    /**
     * @param  array<string, bool>  $capabilities
     * @return array{status: string, reasons: list<array<string, mixed>>}
     */
    public function validate(CampaignPerformanceContext $context, array $capabilities): array
    {
        $reasons = [];

        if ($context->syncFailed && ! ($capabilities['platform_metrics_available'] ?? false)) {
            $reasons[] = [
                'metric' => 'platform_sync',
                'impact' => 'negative',
                'detail' => $context->syncError ?? 'ingest failed',
            ];
        }

        $roiBacked = ($context->affiliate['revenue_source'] ?? null) === 'roi_dashboard'
            && ($context->affiliate['matched'] ?? false) === true;

        if (! ($capabilities['platform_metrics_available'] ?? false) && ! $roiBacked) {
            $reasons[] = [
                'metric' => 'platform_metrics',
                'impact' => 'negative',
                'detail' => 'no hourly or daily rows in Whale',
            ];
        }

        if ($reasons !== []) {
            return ['status' => 'BROKEN', 'reasons' => $reasons];
        }

        return ['status' => 'HEALTHY', 'reasons' => []];
    }
}
