<?php

declare(strict_types=1);

namespace Kylin\RiskControl\Commands;

use Illuminate\Console\Command;

/**
 * 贷款定期重分类命令
 *
 * 依据《商业银行金融资产风险分类办法》：
 * 贷款需定期（每半年）重新分类。
 *
 * 五级分类：
 *  - 正常：未逾期或逾期 <= 30 天
 *  - 关注：逾期 31-90 天
 *  - 次级：逾期 91-180 天
 *  - 可疑：逾期 181-360 天
 *  - 损失：逾期 > 360 天
 *
 * 使用方式：
 *   php artisan risk:reclassify
 *   php artisan risk:reclassify --dry-run
 */
class ReclassifyCommand extends Command
{
    protected $signature = 'risk:reclassify
                            {--dry-run : 预览模式，不实际更新}
                            {--loan-id= : 仅重分类指定贷款}';

    protected $description = '定期重分类贷款资产，符合《商业银行金融资产风险分类办法》要求';

    /**
     * 五级分类及逾期天数阈值
     */
    private const CLASSIFICATION = [
        'normal' => ['label' => '正常', 'max_days' => 30],
        'attention' => ['label' => '关注', 'max_days' => 90],
        'substandard' => ['label' => '次级', 'max_days' => 180],
        'doubtful' => ['label' => '可疑', 'max_days' => 360],
        'loss' => ['label' => '损失', 'max_days' => PHP_INT_MAX],
    ];

    public function handle(): int
    {
        $isDryRun = $this->option('dry-run');

        if ($isDryRun) {
            $this->warn('=== 预览模式：不会实际更新 ===');
            $this->newLine();
        }

        $this->info('开始定期重分类贷款资产...');
        $this->info('法律依据：《商业银行金融资产风险分类办法》');
        $this->info('分类标准：正常(≤30天) / 关注(31-90天) / 次级(91-180天) / 可疑(181-360天) / 损失(>360天)');
        $this->newLine();

        // 业务层需实现 Loan 模型的重分类逻辑
        // 此处提供分类引擎，业务层调用
        $this->info('重分类引擎已就绪。业务层应实现 Loan::reclassify() 方法调用本引擎。');
        $this->info('建议在 App\Console\Kernel::schedule() 中注册：');
        $this->info('  $schedule->command(\'risk:reclassify\')->cron(\'0 0 1 1,7 *\');');

        return self::SUCCESS;
    }

    /**
     * 根据逾期天数确定分类
     *
     * @param int $overdueDays 逾期天数
     * @return array{ classification: string, label: string }
     */
    public static function classify(int $overdueDays): array
    {
        foreach (self::CLASSIFICATION as $key => $config) {
            if ($overdueDays <= $config['max_days']) {
                return [
                    'classification' => $key,
                    'label' => $config['label'],
                ];
            }
        }

        return [
            'classification' => 'loss',
            'label' => '损失',
        ];
    }

    /**
     * 获取所有分类定义
     *
     * @return array<string, array{ label: string, max_days: int }>
     */
    public static function classificationDefinitions(): array
    {
        return self::CLASSIFICATION;
    }
}