<?php

namespace App\Http\Controllers\Frontend;

use App\Http\Controllers\Controller;
use App\Http\Requests\Frontend\DeleteUser;
use App\Http\Requests\Frontend\DeleteUserRequest as FrontendDeleteUserRequest;
use App\Libs\Services\FcmService;
use App\Models\User;
use App\Services\UserDataService;

class DeleteUserController extends Controller
{
    /**
     * Display the form to request a User delete.
     *
     * @return \Illuminate\Http\Response
     */
    public function showDeleteUserRequest()
    {
        return view('frontend.pages.delete-user.request');
    }

    /**
     * Send a delete user link to the given user.
     *
     * @param  \Illuminate\Http\DeleteUserRequest $request
     * @return \Illuminate\Http\Response
     */
    public function sendDeleteUserRequest(FrontendDeleteUserRequest $request, UserDataService $service)
    {
        $data = $request->validated();
        $user = User::where('email', $data['email'])->first();

        if ($user) {
            $service->sendDeleteUserLink($user);
        }

        return view('frontend.pages.delete-user.request', [
            'success' => true
        ]);
    }

    /**
     * Display the form to delete a user accoun.
     *
     * @return \Illuminate\Http\Response
     */
    public function showDeleteUser(string $token)
    {
        $user = User::where('delete_request_token', $token)->first();

        if (!$user) {
            abort(404, trans("response.not_found"));
        }

        if ($user->delete_request_date->addMinutes(User::DELETE_USER_REQUEST_EXPIRATION) < now()) {
            return view('frontend.pages.delete-user.delete', [
                'error' => __('frontend.delete_user_expired')
            ]);
        }

        return view('frontend.pages.delete-user.delete', [
            'email' => $user->email,
            'token' => $user->delete_request_token
        ]);
    }

    /**
     * Send a delete user link to the given user.
     *
     * @param  \Illuminate\Http\DeleteUserRequest $request
     * @return \Illuminate\Http\Response
     */
    public function deleteUser(DeleteUser $request, UserDataService $service, FcmService $fcmService)
    {
        $data = $request->validated();
        $user = User::where('email', $data['email'])
            ->where('delete_request_token', $data['token'])
            ->first();

        if (!$user) {
            abort(404, trans("response.not_found"));
        }

        if ($user->delete_request_date->addMinutes(User::DELETE_USER_REQUEST_EXPIRATION) < now()) {
            return view('frontend.pages.delete-user.delete', [
                'error' => __('frontend.delete_user_expired')
            ]);
        }

        $fcmService->unsubscribeToAllTopics($user);
        $res = $service->deleteUser($user);

        if ($res) {
            return view('frontend.pages.delete-user.delete', [
                'success' => true
            ]);
        } else {
            return view('frontend.pages.delete-user.delete', [
                'error' => __('frontend.delete_user_unexpected_error')
            ]);
        }
    }
}