<?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;
    }

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

            // 【処理1】パラメータ検証
            if (!$this->validateParameters($mailAddress, $backupMailAddress, $mailTemplateId)) {
                $this->error('パラメータが不正です。');
                return self::FAILURE;
            }

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

            // 処理結果確認
            if ($result['success']) {
                $endTime = now();
                $this->info('SHJ メール送信処理が正常に完了しました。');
                $this->info("処理時間: {$startTime->diffInSeconds($endTime)}秒");
                
                Log::info('SHJ メール送信処理完了', [
                    'end_time' => $endTime,
                    'duration_seconds' => $startTime->diffInSeconds($endTime),
                    'result' => $result
                ]);

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

                return self::FAILURE;
            }

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

            return self::FAILURE;
        }
    }

    /**
     * 【処理1】パラメータの妥当性を検証
     * 
     * 仕様書に基づく検証内容:
     * - メールアドレス: 「メールアドレス」「予備メールアドレス」いずれか必須
     * - メールテンプレートID: 必須
     *
     * @param mixed $mailAddress メールアドレス
     * @param mixed $backupMailAddress 予備メールアドレス
     * @param mixed $mailTemplateId メールテンプレートID
     * @return bool 検証結果
     */
    private function validateParameters($mailAddress, $backupMailAddress, $mailTemplateId): bool
    {
        // メールテンプレートIDチェック
        if (empty($mailTemplateId)) {
            $this->error('メールテンプレートIDは必須です。');
            return false;
        }

        // 数値形式チェック（メールテンプレートID）
        if (!is_numeric($mailTemplateId)) {
            $this->error('メールテンプレートIDは数値である必要があります。');
            return false;
        }

        // 正の整数チェック（メールテンプレートID）
        if ($mailTemplateId <= 0) {
            $this->error('メールテンプレートIDは正の整数である必要があります。');
            return false;
        }

        // メールアドレスチェック（いずれか必須）
        if (empty($mailAddress) && empty($backupMailAddress)) {
            $this->error('メールアドレスまたは予備メールアドレスのいずれかは必須です。');
            return false;
        }

        // メールアドレス形式チェック
        if (!empty($mailAddress) && !filter_var($mailAddress, FILTER_VALIDATE_EMAIL)) {
            $this->error('メールアドレスの形式が正しくありません。');
            return false;
        }

        if (!empty($backupMailAddress) && !filter_var($backupMailAddress, FILTER_VALIDATE_EMAIL)) {
            $this->error('予備メールアドレスの形式が正しくありません。');
            return false;
        }

        return true;
    }
}