<?php

namespace App\Http\Controllers;

use App\Http\Requests\AdminDelete;
use App\Http\Requests\RequestChangePassword;
use App\Http\Requests\RequestProfileImage;
use App\Http\Requests\UserAddress;
use App\Http\Requests\UserCompany;
use App\Http\Requests\UserDelete;
use App\Http\Requests\UserIndex;
use App\Http\Requests\UserResendEmail;
use App\Http\Requests\UserPersonalInfo;
use App\Http\Requests\UserUpdateState;
use App\Http\Resources\UserListResource;
use App\Http\Resources\UserResource;
use App\Libs\Services\UserService;
use App\Exports\UsersExport;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Auth\Events\Registered;
use Maatwebsite\Excel\Facades\Excel;

class UserController extends Controller
{
    public function getUsers(UserIndex $request, UserService $userService)
    {
        $data = $request->validated();
        $usersData = $userService->list($data);

        if (!empty($data['countOnly']) && $data['countOnly']) {
            return [
                'count' => $usersData['count']
            ];
        } elseif ($usersData) {
            return [
                'data' => UserListResource::collection($usersData['users']),
                'pagination' => $usersData['pagination'],
            ];
        }
        return response()->json([], 200);
    }

    public function getUser() {
        $userData = Auth::user();
        if ($userData) {
            return new UserResource($userData);
        }

        return response()->json([], 404);
    }

    public function postUserPersonalInfo(UserPersonalInfo $request, UserService $userService) {
        $data = $request->validated();
        $userData = $userService->updateUserPersonalInfo($data);

        if ($userData) {
            return new UserResource($userData);
        }
    }

    public function postUserAddress(UserAddress $request, UserService $userService) {
        $data = $request->validated();
        $userData = $userService->updateUserAddress($data);

        if ($userData) {
            return new UserResource($userData);
        }
    }

    public function postUserCompany(UserCompany $request, UserService $userService) {
        $data = $request->validated();
        $userData = $userService->updateUserCompany($data);

        if ($userData) {
            return new UserResource($userData);
        }
    }

    public function deleteUser(UserDelete $request, UserService $userService) {
        $data = $request->validated();
        $response = $userService->deleteUser($data['id']);
        return $response;
    }

    public function updateUserState(UserUpdateState $request, UserService $userService) {
        $data = $request->validated();
        $userData = $userService->updateUserState($data);

        if ($userData) {
            return new UserResource($userData);
        }
    }

    public function postResend(UserResendEmail $request) {
        $data = $request->validated();
        $user = User::find($data['id']);

        event(new Registered($user));

        return response()->json(['message' => 'success'], 200);
    }

    public function postExport(UserIndex $request)
    {
        $data = $request->validated();

        return Excel::download(new UsersExport($data), 'users.xlsx');
    }

    public function postChangePassword(RequestChangePassword $request, UserService $userService)
    {
        $userData = Auth::user();

        if(empty($userData)) {
            abort(404);
        }

        $data = $request->validated();
        $response = $userService->changePassword($data, $userData);
        return $response;
    }

    public function uploadProfileImage(RequestProfileImage $request, UserService $userService)
    {
        $userData = Auth::user();
        $data = $request->validated();
        $profileImage = $userService->storeProfileImage($data, $userData);

        if (empty($profileImage)) {
            return response()->json(['message' => 'Failed save profile image'], 404);
        }

        return response()->json(['imageLinks' => getProfileImage($profileImage, ['100x100'])]);
    }

    public function getSearchUsers(UserIndex $request, UserService $userService)
    {
        $data = $request->validated();
        $usersData = $userService->search($data);

        return [
            'data' => UserListResource::collection($usersData['users']),
            'pagination' => $usersData['pagination'],
        ];
    }
}
