<?php

namespace App\Console\Commands;

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

/**
 * SHJ メール送信処理コマンド
 * 
 * メールテンプレートを使用したメール送信処理を実行する
 * バックグラウンドで実行される定期バッチ処理
 */
class ShjMailSendCommand extends Command
{
    /**
     * コンソールコマンドの名前とシグネチャ
     * 
     * 引数:
     * - mail_address: メールアドレス (必須)
     * - backup_mail_address: 予備メールアドレス (必須)
     * - mail_template_id: メールテンプレートID (必須)
     *
     * @var string
     */
    protected $signature = 'shj:mail-send {mail_address : メールアドレス} {backup_mail_address : 予備メールアドレス} {mail_template_id : メールテンプレートID}';

    /**
     * コンソールコマンドの説明
     *
     * @var string
     */
    protected $description = 'SHJ メール送信処理 - テンプレートに基づくメール送信を実行';

    /**
     * SHJメール送信サービスクラス
     *
     * @var ShjMailSendService
     */
    protected $shjMailSendService;

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

    /**
     * コンソールコマンドを実行
     *
     * SHJ-7 メール送信処理フロー:
     * 【処理1】入力パラメーターをチェックする
     * 【判断1】チェック結果
     * 【処理2】メール送信テンプレート情報を取得する
     * 【判断2】取得結果
     * 【処理3】メールを送信する
     * 【処理4】処理結果を返却する
     *
     * @return int
     */
    public function handle()
    {
        try {
            // 開始ログ出力
            $startTime = now();
            $this->info('SHJ-7 メール送信処理を開始します。');
            Log::info('SHJ-7 メール送信処理開始', [
                'start_time' => $startTime,
                'mail_address' => $this->argument('mail_address'),
                'backup_mail_address' => $this->argument('backup_mail_address'),
                'mail_template_id' => $this->argument('mail_template_id')
            ]);

            // 引数取得
            $mailAddress = $this->argument('mail_address');
            $backupMailAddress = $this->argument('backup_mail_address');
            $mailTemplateId = $this->argument('mail_template_id');

            // SHJ-7 メール送信処理実行
            $result = $this->shjMailSendService->executeMailSend($mailAddress, $backupMailAddress, $mailTemplateId);

            // 【処理4】処理結果を返却する
            if ($result['result'] === 0) {
                $endTime = now();
                $this->info('SHJ-7 メール送信処理が正常に完了しました。');
                $this->info("処理時間: {$startTime->diffInSeconds($endTime)}秒");

                Log::info('SHJ-7 メール送信処理完了', [
                    'end_time' => $endTime,
                    'duration_seconds' => $startTime->diffInSeconds($endTime),
                    'result' => $result['result'],
                    'error_info' => $result['error_info']
                ]);

                return self::SUCCESS;
            } else {
                $this->error('SHJ-7 メール送信処理でエラーが発生しました: ' . $result['error_info']);
                Log::error('SHJ-7 メール送信処理エラー', [
                    'result' => $result['result'],
                    'error_info' => $result['error_info']
                ]);

                return self::FAILURE;
            }

        } catch (\Exception $e) {
            $this->error('SHJ-7 メール送信処理で予期しないエラーが発生しました: ' . $e->getMessage());
            Log::error('SHJ-7 メール送信処理例外エラー', [
                'exception' => $e->getMessage(),
                'trace' => $e->getTraceAsString()
            ]);

            return self::FAILURE;
        }
    }

}
