<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use App\Services\ShjElevenService;

/**
 * SHJ-11 現在契約台数集計コマンド
 * 
 * 集計単位每个の契約台数を算出し、ゾーンマスタとの管理処理を実行する
 * バックグラウンドで実行される定期バッチ処理
 */
class ShjElevenCommand extends Command
{
    /**
     * コンソールコマンドの名前とシグネチャ
     * 
     * 引数: なし
     * オプション: なし
     *
     * @var string
     */
    protected $signature = 'shj:11';

    /**
     * コンソールコマンドの説明
     *
     * @var string
     */
    protected $description = 'SHJ-11 現在契約台数集計 - 集計単位每个契約台数を算出しゾーンマスタ管理を実行';

    /**
     * SHJ-11サービスクラス
     *
     * @var ShjElevenService
     */
    protected $shjElevenService;

    /**
     * コンストラクタ
     *
     * @param ShjElevenService $shjElevenService
     */
    public function __construct(ShjElevenService $shjElevenService)
    {
        parent::__construct();
        $this->shjElevenService = $shjElevenService;
    }

    /**
     * コンソールコマンドを実行
     *
     * 処理フロー（仕様書準拠）:
     * 【処理1】集計単位每个の契約台数を算出する
     * 【判断1】取得件数判定
     *   - 取得件数 = 0 → 【処理4】バッチログ作成（「全駐輪場契約なし」）→ 終了
     *   - 取得件数 ≥ 1 → 【処理2】ゾーンマスタ処理（循環）→ 終了
     *
     * ※【処理4】は各レコードの処理ごとにService層で呼び出される
     *
     * @return int
     */
    public function handle()
    {
        try {
            // 開始ログ出力
            $startTime = now();
            $this->info('SHJ-11 現在契約台数集計を開始します。');
            Log::info('SHJ-11 現在契約台数集計開始', [
                'start_time' => $startTime
            ]);

            // 【処理1】集計単位每个の契約台数を算出する
            $this->info('【処理1】集計単位每个の契約台数を算出しています...');
            $contractCounts = $this->shjElevenService->calculateContractCounts();

            // 【判断1】取得件数判定
            $countResults = count($contractCounts);
            $this->info("取得件数: {$countResults}件");

            if ($countResults === 0) {
                // 【判断1】取得件数 = 0 の場合
                $this->info('対象なしのため処理を終了します。');

                // 【処理4】bat_job_logに直接書き込み（取得件数=0時）
                $batchLogResult = $this->shjElevenService->writeBatJobLogForNoContracts();

                // bat_job_log書き込み結果をチェック
                if (!$batchLogResult['success']) {
                    $this->warn('bat_job_log書き込みで異常が発生しました');
                    if (isset($batchLogResult['error_message'])) {
                        $this->warn('error_message: ' . $batchLogResult['error_message']);
                    }

                    Log::warning('bat_job_log書き込み失敗（対象なし）', [
                        'error_message' => $batchLogResult['error_message'] ?? null
                    ]);
                }

                Log::info('SHJ-11 現在契約台数集計完了（対象なし）', [
                    'end_time' => now(),
                    'duration_seconds' => $startTime->diffInSeconds(now()),
                    'bat_job_log_success' => $batchLogResult['success']
                ]);

                return self::SUCCESS;
            }

            // 【判断1】取得件数 ≥ 1 の場合
            // 【処理2・3・4】ゾーンマスタ処理（各レコードごとに処理4を実行）
            $this->info('【処理2】ゾーンマスタ処理を実行しています...');
            $this->info('※各レコードごとに【処理4】バッチログを作成します');
            $processResult = $this->shjElevenService->processZoneManagement($contractCounts);

            // 処理結果確認
            if ($processResult['success']) {
                $endTime = now();
                $this->info('SHJ-11 現在契約台数集計が正常に完了しました。');
                $this->info("処理時間: {$startTime->diffInSeconds($endTime)}秒");
                $this->info("処理対象件数: {$countResults}件");
                $this->info("ゾーン新規作成件数: {$processResult['created_zones']}件");
                $this->info("ゾーン更新件数: {$processResult['updated_zones']}件");
                $this->info("限界台数超過件数: {$processResult['over_capacity_count']}件");

                if (!empty($processResult['batch_log_errors'])) {
                    $this->warn("バッチログエラー件数: " . count($processResult['batch_log_errors']) . "件");
                }

                Log::info('SHJ-11 現在契約台数集計完了', [
                    'end_time' => $endTime,
                    'duration_seconds' => $startTime->diffInSeconds($endTime),
                    'processed_count' => $countResults,
                    'created_zones' => $processResult['created_zones'],
                    'updated_zones' => $processResult['updated_zones'],
                    'over_capacity_count' => $processResult['over_capacity_count'],
                    'batch_log_errors' => count($processResult['batch_log_errors'])
                ]);

                return self::SUCCESS;
            } else {
                $this->error('SHJ-11 現在契約台数集計でエラーが発生しました: ' . $processResult['message']);

                Log::error('SHJ-11 現在契約台数集計エラー', [
                    'error' => $processResult['message'],
                    'details' => $processResult['details'] ?? null
                ]);

                return self::FAILURE;
            }

        } catch (\Exception $e) {
            $this->error('SHJ-11 現在契約台数集計で予期しないエラーが発生しました: ' . $e->getMessage());

            Log::error('SHJ-11 現在契約台数集計例外エラー', [
                'exception' => $e->getMessage(),
                'trace' => $e->getTraceAsString()
            ]);

            return self::FAILURE;
        }
    }
}
