<?php

namespace App\PackagesApi\v3\Controllers\User;

use App\Http\Controllers\Controller;
use App\Packages\User\Manager\UserEntityManager;
use App\Packages\User\Models\User;
use App\Packages\User\Models\UserAvatar;
use App\Packages\User\Repository\UserRepository;
use App\Packages\User\Service\UserImageResizeService;
use App\Packages\User\Service\UserImageUploadService;
use App\Packages\User\Transformer\UserTransformer;
use App\PackagesApi\v3\Requests\Settings\UpdateNicknameRequest;
use App\PackagesApi\v3\Requests\Settings\UpdateOnBoarding;
use App\PackagesApi\v3\Requests\Settings\UpdateSettingsRequest;
use App\PackagesApi\v3\Requests\Settings\UploadAvatarRequest;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\UploadedFile;
use Request;

/**
 * Class AuthController
 *
 * @package App\Http\Controllers\API
 */
class SettingsController extends Controller
{
    /** @var User */
    private $user;

    public function __construct()
    {
        $this->user = user();
    }

    /**
     * @return JsonResponse
     */
    public function settings()
    {
        $this->user->saveAccess('View profile settings');

        return jsonSuccess(
            [
                'settings' => UserTransformer::objectSettings($this->user),
            ]
        );
    }

    /**
     * @return JsonResponse
     *
     * @throws \Exception
     */
    public function deleteUser()
    {
        UserEntityManager::deleteUser($this->user);

        return jsonSuccess([
            'message' => 'Your account has been deleted',
        ]);
    }

    /**
     * @param UpdateNicknameRequest $request
     *
     * @return JsonResponse
     */
    public function updateNickname(UpdateNicknameRequest $request)
    {
        $this->user->saveAccess('Update nickname');

        /** @var User $user */
        $user = UserRepository::init()->findByNickname($request->nickname);
        if ($user && user()->id != $user->id) {
            return jsonErrorMessage('Username is already taken');
        }

        UserEntityManager::updateNickname($this->user, $request);

        return jsonSuccess(
            [
                'settings' => UserTransformer::objectSettings($this->user),
            ]
        );
    }

    /**
     * @param UpdateSettingsRequest $request
     *
     * @return JsonResponse
     */
    public function update(UpdateSettingsRequest $request)
    {
        $this->user->saveAccess('Update profile settings');

        /** @var User $user */
        $user = UserRepository::init()->findByNickname($request->nickname);
        if ($user && $this->user->id != $user->id) {
            return jsonErrorMessage('Nickname already registered');
        }

        UserEntityManager::updateSettings($this->user, $request);

        return jsonSuccess([
            'settings' => UserTransformer::objectSettings($this->user),
        ]);
    }

    /**
     * @param UpdateOnBoarding $request
     * @return JsonResponse
     */
    public function onBoardingUpdate(UpdateOnBoarding $request)
    {
        UserEntityManager::updateOnBoarding($this->user, $request);

        return jsonSuccess([
            'settings' => UserTransformer::objectSettings($this->user),
        ]);
    }

    /**
     * @TODO: Recheck avatar upload
     * @TODO: Refactore, save original file
     *
     *
     * @param UploadAvatarRequest $request
     * @param UserImageResizeService $imageResize
     * @return JsonResponse
     */
    public function uploadAvatar(UploadAvatarRequest $request, UserImageResizeService $imageResize)
    {
        $this->user->saveAccess('Update profile avatar');

		/** @var UploadedFile $file */
		$file = $request->avatar;
		$fileContent = file_get_contents($file);

		$avatarResult = $imageResize->resizeToAvatar($fileContent);

		$userAvatar = UserAvatar::createFileData(
			md5($avatarResult),
			UserImageResizeService::IMAGE_EXT,
			UserImageResizeService::IMAGE_MIME,
			$file->getSize(),
			UserImageResizeService::AVATAR_WIDTH,
			UserImageResizeService::AVATAR_HEIGHT
		);

		$uploadService = app()->make(UserImageUploadService::class);
		$uploadService->uploadAvatar($userAvatar, $avatarResult);

		$this->user->avatar_id = $userAvatar->id;
		$this->user->save();

        return jsonSuccess(
            [
                'settings' => UserTransformer::objectSettings($this->user),
            ]
        );
    }

    /**
     * @TODO Add file remove not only id from row.
     *
     * @param Request $request
     * @return JsonResponse
     */
    public function removeAvatar(Request $request)
    {
        $this->user->saveAccess('Removed profile avatar');

        $this->user->avatar_id = null;
        $this->user->save();

        return jsonSuccess(
            [
                'settings' => UserTransformer::objectSettings($this->user),
            ]
        );
    }
}
