<?php

namespace App\Services\Agent;

use App\Models\AgentNode;
use App\Models\AgentProfile;
use Illuminate\Validation\ValidationException;

final class RebateLimitValidator
{
    public function assertPlayerRebateWithinAgent(AgentNode $agent, float $rebateRate, float $extraRebateRate = 0): void
    {
        $profile = AgentProfile::query()->where('agent_node_id', $agent->id)->first();
        if ($profile === null) {
            throw ValidationException::withMessages([
                'rebate_rate' => ['agent_profile_required'],
            ]);
        }

        // Both $rebateRate and $profile->rebate_limit are ratios (0-1)
        $limit = (float) $profile->rebate_limit;
        if ($rebateRate > $limit) {
            throw ValidationException::withMessages([
                'rebate_rate' => ['exceeds_limit'],
            ]);
        }

        if ($extraRebateRate > $limit) {
            throw ValidationException::withMessages([
                'extra_rebate_rate' => ['exceeds_limit'],
            ]);
        }

        if ($extraRebateRate > 0 && ! $profile->can_grant_extra_rebate) {
            throw ValidationException::withMessages([
                'extra_rebate_rate' => ['not_allowed'],
            ]);
        }

        if ($limit > 0 && ($rebateRate + $extraRebateRate) > $limit + 1e-9) {
            throw ValidationException::withMessages([
                'rebate_rate' => ['exceeds_limit'],
            ]);
        }
    }

    public function assertChildRebateLimitWithinParent(AgentNode $parent, float $childRebateLimitRatio): void
    {
        $profile = AgentProfile::query()->where('agent_node_id', $parent->id)->first();
        if ($profile === null) {
            throw ValidationException::withMessages([
                'rebate_limit' => ['parent_profile_required'],
            ]);
        }

        if ($childRebateLimitRatio > (float) $profile->rebate_limit) {
            throw ValidationException::withMessages([
                'rebate_limit' => ['exceeds_parent'],
            ]);
        }
    }
}
