<?php

namespace App\Http\Controllers;

use App\CommonFunction;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\URL;

class MemberRegistrationController extends Controller
{
    // 会員登録案内メール送信
    public function sendMail(Request $request, $management_code)
    {
        // バリデーションチェック
        $rules  = ['email' => 'required | email'];
        $message = [
            'email.required' => 'メールアドレスを入力してください',
            'email.email' => 'メールアドレスの形式が正しくありません'
        ];
        $validator = Validator::make($request->all(), $rules, $message);
        if ($validator->fails()) {
            return redirect("{$management_code}/member_regist")
                ->withErrors($validator)
                ->withInput();
        }

        // 登録済メールアドレスチェック
        $email = $request->input('email');
        $existingMember = User::where('user_primemail', $email)->get();
        foreach ($existingMember as $member) {
            if ($member->user_quit_flag != 1) {
                return redirect("{$management_code}/member_regist")
                    ->withErrors(['email' => '指定のメールアドレスは既に使用されています。'])
                    ->withInput();
            }
        }
        
        // 会員登録用暗号化URL生成（有効期限30分）
        $url = URL::temporarySignedRoute('member_regist_input', now()->addMinutes(30), ['management_code' => $management_code, 'email' => encrypt($email)]);

        // メール送信
        Mail::send(["text" => 'emails.member_regist_info'], ['url' => $url], function ($message) use ($email) {
            $message->to($email)->subject('【So-Manager】新規ユーザー登録用URLのご案内');
        });

        // 完了画面遷移
        return view('general.member_regist_send_mail');
    }

    // メールのURLからアクセス
    public function index($management_code)
    {
        // 署名付きURLの有効期限チェック
        if (!request()->hasValidSignature()) {
            return redirect("{$management_code}/error")->withErrors(['error' => '署名の有効期限が切れています']);
        }

        // パラメータ存在チェック
        $encryptedEmail = request()->query('email');
        if (!$encryptedEmail) {
            return redirect("{$management_code}/error")->withErrors(['error' => 'メールアドレスが指定されていません']);
        }

        // パラメータ整合性チェック
        try {
            $email = decrypt($encryptedEmail);
        } catch (\Exception $e) {
            return redirect("{$management_code}/error")->withErrors(['error' => 'メールアドレスの情報が不正です']);
        }

        // 二重登録防止チェック
        $existingMember = User::where('user_primemail', $email)->get();
        foreach ($existingMember as $member) {
            if ($member->user_quit_flag != 1) {
                return redirect("{$management_code}/error")->withErrors(['error' => '既に登録済みです']);
            }
        }

        // メールアドレスをセッションに保存
        session(['email' => $email]);

        // 入力画面に遷移
        return view('general.member_regist_input', ['management_code' => $management_code]);
    }

    // リダイレクト用
    public function indexBack(Request $request, $management_code)
    {
        if (!session('email')) {
            return redirect("{$management_code}/error")->withErrors(['error' => '不正なアクセスです']);
        }

        // 入力画面に遷移
        return view('general.member_regist_input', ['management_code' => $management_code]);
    }

    // 確認画面表示
    public function confirm(Request $request, $management_code)
    {
        // 登録完了後のブラウザバックによる二重登録対策
        if (!session()->has('email')) {
            return redirect("{$management_code}/error")->withErrors(['error' => '不正なアクセスです']);
        }

        // 入力チェック内容 (メールアドレスはセッションから取得するため対象外)
        $rules  = [
            'name' => 'required',
            'kana' => 'required|regex:/^[ァ-ヶー]+$/u',
            'phone' => [
                'nullable',
                function ($attribute, $value, $fail) use ($request) {
                    $phone = $request->input('phone');
                    $mobile = $request->input('mobile');
                    
                    // 電話番号が部分的に入力されている場合はエラー
                    if (is_array($phone) && !empty(array_filter($phone))) {
                        $filtered = array_filter($phone);
                        if (count($filtered) != count($phone)) {
                            $fail('自宅電話番号は全ての項目を入力してください');
                        }
                    }
                },
            ],
            'mobile' => [
                'nullable',
                function ($attribute, $value, $fail) use ($request) {
                    $phone = $request->input('phone');
                    $mobile = $request->input('mobile');
                    
                    // どちらも未入力の場合はエラー
                    $phoneEmpty = is_array($phone) ? empty(array_filter($phone)) : empty($phone);
                    $mobileEmpty = is_array($mobile) ? empty(array_filter($mobile)) : empty($mobile);
                    
                    if ($phoneEmpty && $mobileEmpty) {
                        $fail('電話番号はどちらかの入力が必須です');
                    }
                    
                    // 携帯電話番号が部分的に入力されている場合はエラー
                    if (is_array($mobile) && !empty(array_filter($mobile))) {
                        $filtered = array_filter($mobile);
                        if (count($filtered) != count($mobile)) {
                            $fail('携帯電話番号は全ての項目を入力してください');
                        }
                    }
                },
            ],
            'birthdate' => 'required|date',
        ];

        // エラーメッセージ (メールアドレスはセッションから取得するため対象外)
        $message = [
            'name.required' => '名前を入力してください',
            'kana.required' => 'フリガナを入力してください',
            'kana.regex' => 'フリガナは全角カタカナで入力してください',
            'birthdate.required' => '生年月日を入力してください',
            'birthdate.date' => '生年月日を正しく入力してください',
        ];

        // バリデーションチェック
        $validator = Validator::make($request->all(), $rules, $message);
        if ($validator->fails()) {
            return redirect("{$management_code}/member_regist_input_back")->withErrors($validator)->withInput();
        }

        // 画面返却値
        $input_data = [
            "name" => $request->input('name'),
            "kana" => $request->input('kana'),
            "phone" => $request->input('phone'),
            "mobile" => $request->input('mobile'),
            "birthdate" => $request->input('birthdate'),
            "email" => session('email'),
        ];

        // 確認画面に遷移
        return view('general.member_regist_confirm',  ['input_data' => $input_data, 'management_code' => $management_code]);
    }

    // 会員登録 or 戻る
    public function complete(Request $request, $management_code)
    {
        // 前の画面に戻る
        if($request->input('submit') == 'back'){
            return redirect("{$management_code}/member_regist_input_back")->withInput();
        }

        // 登録完了後のブラウザバックによる二重登録対策
        if (!session()->has('email')) {
            return redirect("{$management_code}/error")->withErrors(['error' => '不正なアクセスです']);
        }

        // 利用者連番、利用者ID(利用者連番+7DSRチェックデジット)、初期パスワード(ハッシュ化)を生成
        $commonFunction = new CommonFunction();
        $nextSeq = \DB::table('user')->max('user_seq') + 1;
        $userId = $nextSeq . $commonFunction->calc7dsr($nextSeq);
        $userPass = $commonFunction->createPassword();
        $userPassHash = $commonFunction->hashPassword($nextSeq, $userPass);

        // 会員情報登録
        $user = new User();
        $user->user_seq = $nextSeq;
        $user->user_id = $userId;
        $user->user_pass = $userPassHash;
        $user->tag_qr_flag = 1;
        $user->user_name = $request->input('name');
        $user->user_phonetic = $request->input('kana');
        $user->user_homephone = is_array($request->input('phone')) ? implode('-', $request->input('phone')) : null;
        $user->user_mobile = is_array($request->input('mobile')) ? implode('-', $request->input('mobile')) : null;
        $user->user_birthdate = $request->input('birthdate');
        $user->user_primemail = session('email');
        $user->user_quit_flag = 0;
        $user->created_at = now();
        $user->updated_at = now();
        $user->save();

        // セッション削除
        session()->forget('email');

        // 登録完了メール送信
        Mail::send(["text" => 'emails.member_regist_complete'], [
            'user_name' => $request->input('name'),
            'user_pass' => $userPass,
        ], function ($message) use ($user) {
            $message->to($user->user_primemail)->subject('【So-Manager】ユーザー登録完了のご連絡');
        });

        // 完了画面に遷移
        return view('general.member_regist_complete');
    }
}