<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Http\Requests\ForgotPasswordRequest;
use App\Http\Requests\ResetPasswordRequest;
use App\Models\User;
use App\Services\PasswordResetService;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;

class PasswordResetController extends Controller
{
    public function __construct(
        protected PasswordResetService $passwordResetService
    ) {
        $this->middleware('guest');
    }

    public function showForgotPasswordForm(): View
    {
        return view('auth.forgot-password');
    }

    public function sendResetLink(ForgotPasswordRequest $request): RedirectResponse
    {
        $mobile = $request->validated('mobile');

        $user = User::where('mobile', $mobile)->first();

        if (!$user) {
            return redirect()->back()->withErrors([
                'mobile' => 'No account found with this mobile number.',
            ])->withInput();
        }

        if (!$user->password) {
            return redirect()->back()->withErrors([
                'mobile' => 'Password not set for this account. Please use OTP login.',
            ])->withInput();
        }

        $otp = $this->passwordResetService->generateOtp();
        $sent = $this->passwordResetService->sendResetOtp($mobile, $otp);

        if (!$sent) {
            return redirect()->back()->with('error', 'Failed to send reset OTP. Please try again.');
        }

        $this->passwordResetService->storeResetOtp($mobile, $otp);

        return redirect()->route('password.reset')->with([
            'success' => 'Password reset OTP sent to your mobile number.',
            'mobile' => $mobile,
            'show_reset' => true,
        ]);
    }

    public function showResetForm(): View
    {
        return view('auth.reset-password');
    }

    public function resetPassword(ResetPasswordRequest $request): RedirectResponse
    {
        $data = $request->validated();

        $verified = $this->passwordResetService->verifyResetOtp($data['mobile'], $data['otp']);

        if (!$verified) {
            return redirect()->back()->withErrors([
                'otp' => 'Invalid or expired OTP.',
            ])->withInput($request->only('mobile'));
        }

        $reset = $this->passwordResetService->resetPassword($data['mobile'], $data['password']);

        if (!$reset) {
            return redirect()->back()->with('error', 'Failed to reset password. Please try again.');
        }

        return redirect()->route('login')->with('success', 'Password reset successfully. Please login with your new password.');
    }
}

