<?php

namespace App\Packages\User\Manager;

use App\Packages\User\Models\User;
use App\Packages\User\Repository\UserRepository;
use App\PackagesApi\v3\Requests\Settings\UpdateNicknameRequest;
use App\PackagesApi\v3\Requests\Settings\UpdateOnBoarding;
use App\PackagesApi\v3\Requests\Settings\UpdateSettingsRequest;
use Hash;

/**
 * Class UserEntityManager
 * @package App\Manager\User
 */
class UserEntityManager
{
    /**
     * @param $phoneCode
     * @param $phoneNumber
     *
     * @return User
     */
    public static function createUserFromPhoneNumber($phoneCode, $phoneNumber)
    {
        $phoneHash = phoneHash($phoneCode, $phoneNumber);
        $user = UserRepository::init()->firstByPhoneHash($phoneHash);

        if (!$user) {
            $user = UserEntityManager::createUserFromPhoneHash($phoneHash);
        }

        return $user;
    }

    /**
     * @param string $phoneHash
     *
     * @return User
     */
    public static function createUserFromPhoneHash($phoneHash)
    {
        $user = new User();
        $user->nickname = "";
        $user->phone_hash = $phoneHash;
        $user->password = Hash::make($phoneHash);
        $user->phone_code = "";
        $user->phone_number = "";
        $user->is_registered = false;
        $user->save();

        return $user;
    }

	/**
	 * @param string $phoneCode
	 * @param string $phoneNumber
     *
	 * @return User
	 */
	public static function createUser($phoneCode, $phoneNumber)
	{
		$user = new User();
		$user->nickname = "";
        $user->phone_hash = phoneHash($phoneCode, $phoneNumber);
		$user->password = Hash::make($phoneCode);
		$user->phone_code = $phoneCode;
		$user->phone_number = $phoneNumber;
		$user->is_registered = true;
		$user->save();

		return $user;
	}

    /**
     * @param User $user
     * @param UpdateNicknameRequest $request
     *
     * @return User
     */
    public static function updateNickname(User $user, UpdateNicknameRequest $request)
    {
        $user->nickname = mb_strtolower($request->nickname);
        $user->is_registered = true;
        $user->save();

        return $user;
    }

    /**
     * @param User $user
     * @param UpdateSettingsRequest $request
     *
     * @return User
     */
    public static function updateSettings(User $user, UpdateSettingsRequest $request)
    {
        $user->nickname = mb_strtolower($request->nickname);
        $user->is_notification_app = $request->isAppNotificationsEnabled;
        $user->is_notification_push = $request->isPushNotificationsEnabled;
        $user->save();

        return $user;
    }

    /**
     * @param User $user
     * @param UpdateOnBoarding $request
     *
     * @return User
     */
    public static function updateOnBoarding(User $user, UpdateOnBoarding $request)
    {
        $user->is_on_boarding_done = (bool)$request->onboarding_done;
        $user->save();

        return $user;
    }

    /**
     * @param User $user
     * @return bool|null
     * @throws \Exception
     */
    public static function deleteUser(User $user)
    {
        $user->phone_code = null;
        $user->phone_number = null;
        $user->nickname = null;
        $user->phone_hash = null;
        $user->save();

        return $user->delete();
    }
}
