<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
use App\Services\ShjFourBService;

/**
 * SHJ-4B 決済トランザクション処理ジョブ
 * 
 * SHJ-4Aで登録された決済情報を基に定期契約の更新処理を行う
 */
class ProcessSettlementJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * ジョブの実行可能回数
     *
     * @var int
     */
    public $tries = 3;

    /**
     * ジョブの実行間隔（秒）
     *
     * @var array
     */
    public $backoff = [60, 300, 900];

    /**
     * 使用するキュー名
     *
     * @var string
     */
    public $queue = 'settlement';

    /**
     * 決済トランザクションID
     *
     * @var int
     */
    protected $settlementTransactionId;

    /**
     * 追加のコンテキスト情報
     *
     * @var array
     */
    protected $context;

    /**
     * コンストラクタ
     *
     * @param int $settlementTransactionId 決済トランザクションID
     * @param array $context 追加のコンテキスト情報
     */
    public function __construct(int $settlementTransactionId, array $context = [])
    {
        $this->settlementTransactionId = $settlementTransactionId;
        $this->context = $context;
    }

    /**
     * ジョブを実行
     * 
     * SHJ-4Bサービスを使用して決済トランザクション処理を実行
     *
     * @return void
     */
    public function handle()
    {
        $startTime = now();

        try {
            Log::info('SHJ-4B ProcessSettlementJob開始', [
                'settlement_transaction_id' => $this->settlementTransactionId,
                'context' => $this->context,
                'start_time' => $startTime,
            ]);

            // SHJ-4Bサービスを使用して決済トランザクション処理を実行
            // バッチログはShjFourBServiceが自動的にSHJ-8経由で作成
            $shjFourBService = app(ShjFourBService::class);
            $result = $shjFourBService->processSettlementTransaction(
                $this->settlementTransactionId,
                $this->context
            );

            // 処理結果のログ記録
            if ($result['success']) {
                Log::info('SHJ-4B ProcessSettlementJob完了', [
                    'settlement_transaction_id' => $this->settlementTransactionId,
                    'execution_time' => now()->diffInSeconds($startTime),
                    'result' => $result,
                ]);
            } else {
                // ビジネスロジック上の問題（エラーではない）
                Log::warning('SHJ-4B ProcessSettlementJob要手動対応', [
                    'settlement_transaction_id' => $this->settlementTransactionId,
                    'result' => $result,
                ]);
            }

        } catch (\Throwable $e) {
            Log::error('SHJ-4B ProcessSettlementJob失敗', [
                'settlement_transaction_id' => $this->settlementTransactionId,
                'error' => $e->getMessage(),
                'trace' => $e->getTraceAsString(),
            ]);

            // エラー時もShjFourBServiceが自動的にバッチログを作成
            // ジョブを失敗させて再試行を促す
            throw $e;
        }
    }

    /**
     * ジョブが失敗した場合の処理
     *
     * @param \Throwable $exception
     * @return void
     */
    public function failed(\Throwable $exception)
    {
        Log::error('SHJ-4B ProcessSettlementJob最終失敗', [
            'settlement_transaction_id' => $this->settlementTransactionId,
            'context' => $this->context,
            'error' => $exception->getMessage(),
            'attempts' => $this->attempts(),
        ]);

        // バッチログはShjFourBServiceが既に作成済み
        // 最終失敗時の追加処理があればここに記述
        // 例：管理者への通知、障害キューへの登録など
    }
}
