<?php

namespace App\Services;

use App\Libs\Consts\StatusConst;
use App\Repositories\Interfaces\UserProfileRepositoryInterface;
use App\Repositories\Interfaces\UserRepositoryInterface;
use Carbon\Carbon;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

class UserService
{

    protected $userRepository;
    protected $userProfileRepository;
    protected $emailService;

    public function __construct(UserRepositoryInterface $userRepository, UserProfileRepositoryInterface $userProfileRepository,
        EmailService $emailService
    ) {
        $this->userRepository = $userRepository;
        $this->userProfileRepository = $userProfileRepository;
        $this->emailService = $emailService;
    }

    public function getAllUsers()
    {
        $users = $this->userRepository->all();

        foreach ($users as $key => $user) {
            if ($user->role->role === 'System Admin') {
                unset($users[$key]);
            } else {
                $users[$key]->userProfile = $this->getProfile($user->id);
            }
        }
        
        return $users;
    }

    public function storeUser($request, $loggedUser)
    {
    
        $payload = $request->all();
        $payload['status'] = $request->get('status') == "on" ? StatusConst::ACTIVE : StatusConst::INACTIVE;
        $payload['uuid'] = Str::uuid()->toString();
        $payload['app_id'] = config('desxpert.app_id');
        $payload['created_by'] = $loggedUser->id;
        $user = $this->userRepository->create($payload);
        
        $profilePayload = [
            'user_id' => $user->id,
            'first_name' => $payload['first_name'],
            'middle_name' => $payload['middle_name'],
            'last_name' => $payload['last_name'],
        ];

        $profile = $this->userProfileRepository->create($profilePayload);

        $codeDateCreated = Carbon::createFromFormat('Y-m-d H:i:s', $user->created_at);
        $generatedCode = Hash::make($user->email);

        $emailPayload = [
            'user_id' => $user->id,
            'verification_code' => $generatedCode,
            'expire_at' => $codeDateCreated->addDays(3)

        ];

        $this->emailService->storeVerificationCode($emailPayload);

        $emailInfo = [
            'name' => $profile->first_name,
            'email' => $user->email,
            'link' =>  config('app.url').'/set-password?link='.$generatedCode
        ];

        $this->emailService->sendEmail('account-activation', $emailInfo);

        $response = [
            'status' => 'success',
            'message' => 'Success! The new user has been created.'
        ];

        return $response;
    }

    public function getUser($id)
    {
        $user = $this->userRepository->find($id);
        $user->userProfile = $this->getProfile($user->id);

        return $user;
    }

    public function updateUser($request, $userId)
    {

        $userPayload = $request->only('username', 'role_id', 'updated_by');
        $userPayload['status'] = $request->get('status') == "on" ? StatusConst::ACTIVE : StatusConst::INACTIVE;
        $userPayload['updated_at']  = Carbon::now()->toDateTimeString();
        
        $profilePayload = $request->only('first_name', 'middle_name', 'last_name');

        $this->userProfileRepository->update($profilePayload, $userId);
        $this->userRepository->update(['updated_by'=>''], $userId); // to update even $userpayload has not change
        $this->userRepository->update($userPayload, $userId);

        $response = [
            'status' => 'success',
            'message' => 'Success! The user has been updated.'
        ];

        return $response;
    }

    public function removeUser($id)
    {
        return $this->userRepository->delete($id);
    }

    public function getByRole($roleId)
    {
        $users = $this->userRepository->getByRole($roleId);
        
        return $users;
    }

    public function getProfile($userId)
    {
        return $this->userProfileRepository->getByUser($userId);
    }

    public function checkIfUserDataIfAvailable($request)
    {
        $inputEmail = $request->get('email');
        $inputUsername = $request->get('username');
        $emailId = $request->get('id');

        if (!empty($inputEmail)) {
            $user = $this->userRepository->getByColumn('email', $inputEmail);

            if (!empty($user)) {
                if ($user->id != $emailId) {
                    return ['status' => StatusConst::BAD_REQUEST, 'message' => 'Email is already existing'];
                }
            }
        }

        if (!empty($inputUsername)) {
            $user = $this->userRepository->getByColumn('username', $inputUsername);

            if (!empty($user)) {
                if ($user->id != $emailId) {
                    return ['status' => StatusConst::BAD_REQUEST, 'message' => 'Username is already existing'];
                }
            }
        }

        return ['status' => StatusConst::SUCCESS, 'message' => ''];
    }
}
