<?php

declare(strict_types=1);

class EventFunnelAI
{
    public function analyze(array $row): array
    {
        $score = 0;

        $score += $this->stepScore(
            (string)($row['current_step'] ?? '')
        );

        $score += $this->timeScore(
            $row['step_changed_at']
                ?? $row['created_at']
                ?? null
        );

        $score += $this->eventPressure(
            $row['deadline'] ?? null
        );

        $score -= $this->fatiguePenalty(
            (int)($row['reminder_count'] ?? 0)
        );

        $score = max(0, min(100, $score));

        return [
            'score' => $score,
            'priority' => $this->getPriority($score),
        ];
    }

    private function stepScore(string $step): int
    {
        return match ($step) {
            'start' => 15,
            'ign' => 25,
            'game_id' => 30,
            'referral' => 35,
            'private_channel',
            'force_join' => 20,
            'payment' => 40,
            default => 10
        };
    }

    /**
     * مدت توقف کاربر در مرحله فعلی
     */
    private function timeScore(?string $stepChangedAt): int
    {
        if (!$stepChangedAt) {
            return 0;
        }

        $timestamp = strtotime($stepChangedAt);

        if ($timestamp === false) {
            return 0;
        }

        $ageHours = (time() - $timestamp) / 3600;

        return match (true) {
            $ageHours < 1 => 5,
            $ageHours < 3 => 10,
            $ageHours < 6 => 20,
            $ageHours < 24 => 30,
            default => 40
        };
    }

    private function eventPressure(?string $deadline): int
    {
        if (!$deadline) {
            return 0;
        }

        $deadlineTimestamp = strtotime($deadline);

        if ($deadlineTimestamp === false) {
            return 0;
        }

        $diff = $deadlineTimestamp - time();

        if ($diff <= 0) {
            return 0;
        }

        return match (true) {
            $diff < 600 => 40,       // کمتر از ۱۰ دقیقه
            $diff < 3600 => 30,      // کمتر از یک ساعت
            $diff < 86400 => 20,     // کمتر از یک روز
            default => 5
        };
    }

    /**
     * یادآوری‌های بیشتر یعنی احتمال خستگی کاربر بیشتر است.
     * این مقدار فقط Priority را کاهش می‌دهد، نه لحن را.
     */
    private function fatiguePenalty(int $reminderCount): int
    {
        return match (true) {
            $reminderCount <= 1 => 0,
            $reminderCount === 2 => 5,
            $reminderCount === 3 => 10,
            default => 15
        };
    }

    private function getPriority(int $score): string
    {
        return match (true) {
            $score < 35 => 'low',
            $score < 70 => 'medium',
            default => 'high'
        };
    }
}