<?php

namespace App\Http\Controllers\Backoffice;

use App\Http\Controllers\Controller;
use App\Http\Requests\Backoffice\AdminContentAutoComplete;
use App\Http\Requests\Backoffice\UserEdit;
use App\Facades\Backoffice\BackendUserService;
use App\Http\Requests\Backoffice\ContentTypeListRequest;
use App\Http\Requests\Backoffice\UserRequest;
use App\Services\UserService;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Auth\Events\Registered;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;
use Inertia\Inertia;
use Symfony\Component\HttpKernel\Exception\HttpException;

class UsersController extends Controller
{
    /* BO Function */
    public function getIndex(Request $request)
    {
        $loggedUser = BackendUserService::getLoggedUser();

        return Inertia::render('Backoffice/Users/ListUsers', [
            'data' => [
                'user'          => $loggedUser,
            ]
        ]);
    }

    /* BO Function */
    public function postList(ContentTypeListRequest $request, UserService $userService)
    {
        $data = $request->validated();

        $sort = isset($data['sort']) ? array($data['sort']['key'] => $data['sort']['order']) : array("first_name" => "asc");

        $list = $userService->getUserGridList($data['page'], $data['itemsPerPage'], $sort, $data['search']);

        return response()->json($list);
    }

    /* BO Function */
    public function getEdit($userId = null)
    {
        $loggedUser = BackendUserService::getLoggedUser();
        $canView = $loggedUser->hasPermission("users.view");

        if(empty($userId)){
            throw new HttpException(400, 'User ID is required');
        }

        $user = User::find($userId);

        if(empty($user)){
            throw new HttpException(404, 'User not found');
        }

        return Inertia::render('Backoffice/Users/EditUser', [
            'data' => [
                'canView' => $canView,
                'user' => $user,
            ],
            'message' => Session::get('message'),
            'errorMessage' => Session::get('errorMessage')
        ]);
    }

    /* BO Function */
    public function postEdit(UserEdit $request, UserService $userService, $userId)
    {
        if(empty($userId)){
            throw new HttpException(400, 'User ID is required');
        }

        $data = $request->validated();

        $user = $userService->editUser($userId, $data);

        $message = trans('backend.updated_successfully',
            array('entity' => trans('backend.user')));

        return redirect()->to('/admin/users/edit/' . $user->id)->withMessage($message);
    }

    /* BO Function */
    public function postDelete(UserRequest $request)
    {
        $data = $request->validated();
        $user = User::find($data['userId']);

        if(!empty($user)){
            $ownedAccount = $user->ownAccount;

            if (empty($ownedAccount)) {
                $user->delete();
            } else {
                if ($ownedAccount->activeSubscriptions()->exists()) {
                    throw new HttpException(422, trans('backend.error_user_owner_account_with_active_subscription'));
                }

                DB::transaction(function () use ($ownedAccount, $user) {
                    $ownedAccount->delete();
                    $user->delete();
                });
            }
        }

        return response()->json(["success" => true]);
    }

    /* BO Function */
    public function postResend(UserRequest $request, UserService $userService) {
        $data = $request->validated();
        $userService->generateUserCode($data['userId']);
    }

    /* Method to retrieve Users list for SelectModel property in SelectBox */
    public function postUsersAutoComplete(AdminContentAutoComplete $request)
    {
        $data = $request->validated();
        $searchTerm = urldecode($data['searchTerm']);
        $exactId = !empty($data['id']) ? $data['id'] : null;

        $query = User::selectRaw("id, CONCAT_WS(' ', first_name, last_name, CONCAT('(', email, ')')) as title");

        if (!empty($searchTerm)) {
            $query->where(function ($query) use ($searchTerm) {
                $query->whereRaw("CONCAT_WS(' ', first_name, last_name) like ?", ["%$searchTerm%"])
                    ->orWhere('email', 'like', "%$searchTerm%");
            });
        }

        if (!is_null($exactId)) {
            $query->where('id', $exactId);
        }

        $query->orderByRaw("CONCAT_WS(' ', first_name, last_name) ASC");

        $users = $query->limit(5)->get();

        return response()->json($users, 200);
    }
}
