<?php

namespace App\Console\Commands;

use App\Models\AgentNode;
use App\Models\AgentProfile;
use App\Services\Agent\AgentCreditAllocatedSyncService;
use Illuminate\Console\Command;

/** 按直属玩家/下级代理授信重算 allocated_credit，修复历史增量漂移。 */
final class SyncAgentAllocatedCreditCommand extends Command
{
    protected $signature = 'lottery:sync-agent-allocated-credit {--site= : 仅处理指定 admin_sites.code}';

    protected $description = '重算代理已下发额度（allocated_credit）';

    public function handle(AgentCreditAllocatedSyncService $sync): int
    {
        $siteCode = $this->option('site');
        $query = AgentNode::query()->orderBy('id');
        if (is_string($siteCode) && $siteCode !== '') {
            $query->whereHas('adminSite', static fn ($q) => $q->where('code', $siteCode));
        }

        $nodes = $query->get();
        $updated = 0;
        foreach ($nodes as $node) {
            $profile = AgentProfile::query()->where('agent_node_id', $node->id)->first();
            $before = $profile !== null ? (int) $profile->allocated_credit : null;
            $sync->syncForAgent($node);
            $profile?->refresh();
            $after = $profile !== null ? (int) $profile->allocated_credit : null;
            if ($before !== $after) {
                $updated++;
            }
        }

        $this->info('已处理 '.count($nodes).' 个代理节点，其中 '.$updated.' 个 allocated_credit 有变更。');

        return self::SUCCESS;
    }
}
