<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;

use App\Mail\UserEditVerifyMail;

use Illuminate\Foundation\Validation\ValidatesRequests;
use App\Http\Controllers\Controller;

class UserEditConfirmController extends Controller
{
    use ValidatesRequests;
    public function show(Request $request)
    {
        $user_id = session('user_id');
        if (!$user_id) {
            return redirect('/login');
        }
        $user = DB::table('user')->where('user_id', $user_id)->first();
        if (!$user) {
            return redirect('/login');
        }

        // 直前のPOST値をold()やsession()->get('_old_input')で取得
        $input = session()->get('_old_input', []);

        \Log::info('ユーザー情報編集確認画面にアクセス', [
            'user_id' => $user_id,
        ]);

        return view('user.confirm', [
            'user' => $user,
            'input' => $input,
            'active_menu' => 'SWC-1-1', // マイページメニューの選択状態用
            'user_name' => $user ? $user->user_name : '', // ユーザー名（ヘッダー用）
        ]);
    }

    // 入力内容確認画面から「変更を確定する」ボタン押下時
    public function submit(Request $request)
    {
        $user_id = session('user_id');
        if (!$user_id) {
            return redirect('/login');
        }
        $user = DB::table('user')->where('user_id', $user_id)->first();
        if (!$user) {
            return redirect('/login');
        }

        $token = Str::random(64);
        $changeData = $request->except(['_token']);
        $changeData['user_id'] = $user_id;
        $changeData['user_seq'] = $user->user_seq;

        // 本人確認書類画像アップロード処理
        if ($request->hasFile('photo_filename1') && $request->file('photo_filename1')->isValid()) {
            $file1 = $request->file('photo_filename1');
            $filename1 = uniqid('photo1_') . '.' . $file1->getClientOriginalExtension();
            $file1->storeAs('photo', $filename1, 'public');
            $changeData['photo_filename1'] = $filename1;
        }
        if ($request->hasFile('photo_filename2') && $request->file('photo_filename2')->isValid()) {
            $file2 = $request->file('photo_filename2');
            $filename2 = uniqid('photo2_') . '.' . $file2->getClientOriginalExtension();
            $file2->storeAs('photo', $filename2, 'public');
            $changeData['photo_filename2'] = $filename2;
        }

        Cache::put('change_request_' . $token, $changeData, now()->addDay());

        $verifyUrl = route('user.edit.verify', ['token' => $token]);

        // Mailableでメール送信
        Mail::to($changeData['user_primemail'])->send(new UserEditVerifyMail($verifyUrl, $user));

        \Log::info('ユーザー情報変更メール送信完了画面にアクセス', [
            'user_id' => $user_id,
        ]);

        return view('user.mail_sent', [
            'active_menu' => 'SWC-1-1', // マイページメニューの選択状態用
            'user_name' => $user ? $user->user_name : '', // ユーザー名（ヘッダー用）
        ]);
    }

    // 認証URLクリック時（変更確定処理）
    public function verify(Request $request)
    {
        $token = $request->query('token');
        $changeData = Cache::get('change_request_' . $token);

        if (!$changeData) {
            return redirect()->route('user.edit')->withErrors(['register_expired' => '登録期間が過ぎています。もう一度登録してください。']);
        }

        // 変更内容をDBに保存（userテーブル更新）
        // 更新データ生成（photo_filename1, photo_filename2, user_passは入力時のみ追加）
        $updateData = [
            'user_gender' => $changeData['user_gender'] ?? null,
            'user_regident_zip' => $changeData['user_regident_zip_1'] . $changeData['user_regident_zip_2'],
            'user_regident_pre' => $changeData['user_regident_pre'],
            'user_regident_city' => $changeData['user_regident_city'],
            'user_regident_add' => $changeData['user_regident_add'],
            'user_birthdate' => $changeData['user_birthdate'],
            'user_age' => $changeData['user_age'],
            'user_homephone' => implode('-', $changeData['user_homephone'] ?? []),
            'user_mobile' => implode('-', $changeData['user_mobile'] ?? []),
            'user_primemail' => $changeData['user_primemail'],
            'user_submail' => $changeData['user_submail'],
            // 利用者区分（user_categoryid）をusertypeテーブルから取得して登録
            // 画面からはuser_category（一般/学生）が渡ってくる
            'user_categoryid' => self::getUserCategoryId($changeData['user_category'] ?? null),
            'user_workplace' => $changeData['user_workplace'] ?? null,
            'user_school' => $changeData['user_school'] ?? null,
            'user_graduate' => $changeData['user_graduate'] ?? null,
            'user_relate_zip' => $changeData['user_relate_zip_1'] . $changeData['user_relate_zip_2'],
            'user_relate_pre' => $changeData['user_relate_pre'],
            'user_relate_city' => $changeData['user_relate_city'],
            'user_relate_add' => $changeData['user_relate_add'],
            'updated_at' => now(), //
        ];
        if (!empty($changeData['photo_filename1'])) {
            $updateData['photo_filename1'] = $changeData['photo_filename1'];
        }
        if (!empty($changeData['photo_filename2'])) {
            $updateData['photo_filename2'] = $changeData['photo_filename2'];
        }
        if (!empty($changeData['user_pass'])) {
            $updateData['user_pass'] = self::customPasswordHash($changeData['user_pass'], $changeData['user_seq']);
        }
        DB::table('user')
            ->where('user_id', $changeData['user_id'])
            ->update($updateData);

        // キャッシュ削除
        Cache::forget('change_request_' . $token);

        // 完了画面へ（ユーザー情報確認画面にリダイレクトし、成功メッセージ表示）
        return redirect()->route('user.info')->with('success', '更新に成功しました。');
    }

    /**
     * 利用者区分の文言（一般/学生）からuser_categoryidを取得
     */
    private static function getUserCategoryId($categoryName)
    {
        if (!$categoryName) return null;
        $row = DB::table('usertype')->where('usertype_subject1', $categoryName)->first();
        return $row ? $row->user_categoryid : null;
    }

    /**
     * パスワードをSHA256→SALT連結→25回ストレッチでハッシュ化
     */
    private static function customPasswordHash($password, $user_seq)
    {
        $salt = $user_seq . 'SOMSALT';
        $hash = hash('sha256', $password);
        $hash .= $salt;
        for ($i = 0; $i < 25; $i++) {
            $hash = hash('sha256', $hash);
        }
        return $hash;
    }
}
