<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use App\Models\Ope;

class ResetPasswordController extends Controller
{
    public function showResetForm(Request $request)
    {
        $token = $request->query('token');
        $email = $request->query('email');

        // トークンのハッシュ化
        $tokenHash = hash('sha256', $token);

        // トークン・メール・24時間以内の有効性をチェック
        $record = DB::table('password_reset_tokens')
            ->where('ope_mail', $email)
            ->where('token', $tokenHash)
            ->first();

        if (!$record) {
            return redirect()->route('forgot_password')
                ->withErrors(['email' => 'URLの有効期限（24時間）が切れました。再度お手続きを行ってください。']);
        }

        // 24時間チェック
        $createdAt = \Carbon\Carbon::parse($record->created_at);
        if ($createdAt->addHours(24)->isPast()) {
            // 期限切れトークンを削除
            DB::table('password_reset_tokens')
                ->where('ope_mail', $email)
                ->delete();

            return redirect()->route('forgot_password')
                ->withErrors(['email' => 'URLの有効期限（24時間）が切れました。再度お手続きを行ってください。']);
        }

        return view('auth.reset-password', compact('token', 'email'));
    }

    public function reset(Request $request)
    {
        $request->validate([
            'email' => 'required|email',
            'token' => 'required',
            'password' => 'required|confirmed|min:8',
        ]);

        // トークンのハッシュ化
        $tokenHash = hash('sha256', $request->token);

        // トークン・メール・24時間以内の有効性をチェック
        $record = DB::table('password_reset_tokens')
            ->where('ope_mail', $request->email)
            ->where('token', $tokenHash)
            ->first();

        if (!$record) {
            return back()->withErrors(['email' => 'URLの有効期限（24時間）が切れました。再度お手続きを行ってください。']);
        }

        // 24時間チェック
        $createdAt = \Carbon\Carbon::parse($record->created_at);
        if ($createdAt->addHours(24)->isPast()) {
            // 期限切れトークンを削除
            DB::table('password_reset_tokens')
                ->where('ope_mail', $request->email)
                ->delete();

            return back()->withErrors(['email' => 'URLの有効期限（24時間）が切れました。再度お手続きを行ってください。']);
        }

        // パスワード更新
        $user = Ope::where('ope_mail', $request->email)->first();
        if (!$user) {
            return back()->withErrors(['email' => 'ユーザーが見つかりません。']);
        }
        $user->password = Hash::make($request->password);
        $user->updated_at = now();
        // パスワード再設定時もope_pass_changed_atを更新
        $user->ope_pass_changed_at = now();
        $user->save();

        // トークン削除
        DB::table('password_reset_tokens')->where('ope_mail', $request->email)->delete();

        // パスワード再設定成功画面へリダイレクト
        return redirect()->route('password.change.success');
    }
}