<?php

namespace App\Packages\v4\User\Transformer;

use App\Packages\v4\Capsule\Services\CapsuleProfileService;
use App\Packages\Follower\Models\FollowerRelation;
use App\Packages\Friend\Models\FriendInvite;
use App\Packages\Friend\Models\FriendRelation;
use App\Packages\User\Models\User;
use App\Packages\v4\Follower\Repository\FollowerRepository;
use App\Packages\v4\Friend\Repository\FriendRepository;
use Illuminate\Contracts\Container\BindingResolutionException;
use stdClass;

/**
 * @TODO: Remove phone code, number from response objects, test case
 *
 * Class UserTransformer
 * @package App\Packages\User\Transformer\v4
 */
class UserTransformer
{
    /**
     * @param User $user
     * @return array
     */
    public static function baseInfoObject(User $user)
    {
        $result = [
            'user_id' => $user->uuid,
            'nickname' => $user->nickname,
        ];

        if ($user->avatar) {
            $result['image_url'] = $user->avatar->getAwsFullPath();

            if ($original_avatar = $user->originalAvatarUrl())
                $result['original_image_url'] = $original_avatar;
        }

        return $result;
    }

    /**
     * @param User $user
     *
     * @return array
     */
    public static function smallObject(User $user)
    {
        $result = [
            "user_id" => $user->uuid,
            "nickname" => $user->nickname,
        ];

        if ($user->avatar) {
            $result['image_url'] = $user->avatar->getAwsFullPath();

            if ($original_avatar = $user->originalAvatarUrl())
                $result['original_image_url'] = $original_avatar;
        }

        return $result;
    }

    /**
     * @param User $user
     * @param User $watcherUser - invited by user or is friend - user who watches
     *
     * @return array
     */
    public static function middleObject(User $user, User $watcherUser)
    {
        $result = [
            "user_id" => $user->uuid,
            "nickname" => $user->nickname,
        ];

        if ($user->avatar) {
            $result['image_url'] = $user->avatar->getAwsFullPath();

            if ($original_avatar = $user->originalAvatarUrl())
                $result['original_image_url'] = $original_avatar;
        }

        if ($user->id != $watcherUser->id) {
            $is_follower = FollowerRepository::init()->isFollower($user, $watcherUser);
            $is_following = FollowerRepository::init()->isFollowing($user, $watcherUser);

            if ($user->is_private) {
                $is_invited = FollowerRepository::init()->isInvited($user, $watcherUser);
                $result['is_invited'] = $is_invited;
            }

            $result['is_follower'] = $is_follower;
            $result['is_following'] = $is_following;
        }

        return $result;
    }

    /**
     * @param User $user
     * @param User $watcherUser - invited by user or is friend - user who watches
     *
     * @return array
     * @throws BindingResolutionException
     */
    public static function objectUserProfile(User $user, User $watcherUser)
    {
        $followersCount = FollowerRepository::init()->countUserFollowers($user);
        $followingCount = FollowerRepository::init()->countUserFollowing($user);

        /** @var CapsuleProfileService $profileService */
        $profileService = app()->make(CapsuleProfileService::class);
        $capsuleCount = $profileService->getProfileCapsulesCount($user);

        $result = [
            "user_id" => $user->uuid,
            "nickname" => $user->nickname,

            "count_capsules" => $capsuleCount,
            "count_followers" => $followersCount,
            "count_following" => $followingCount,

            "phone_hash" => (string)$user->phone_hash,
            "phone_code" => (string)$user->phone_code,
            "phone_number" => (string)$user->phone_number,
            "is_private" => (bool)$user->is_private
        ];

        if ($user->avatar) {
            $result['image_url'] = $user->avatar->getAwsFullPath();

            if ($original_avatar = $user->originalAvatarUrl())
                $result['original_image_url'] = $original_avatar;
        }

        if ($user->id != $watcherUser->id) {
            $is_follower = FollowerRepository::init()->isFollower($user, $watcherUser);
            $is_following = FollowerRepository::init()->isFollowing($user, $watcherUser);

            if ($user->is_private) {
                $is_invited = FollowerRepository::init()->isInvited($user, $watcherUser);
                $result['is_invited'] = $is_invited;
            }

            $result['is_follower'] = $is_follower;
            $result['is_following'] = $is_following;
        }

        return $result;
    }

    /**
     * @param User $user
     *
     * @return array
     */
    public static function objectSettings(User $user)
    {
        $result = [
            'phone_code' => (string)$user->phone_code,
            'phone_number' => (string)$user->phone_number,
            'phone_hash' => (string)$user->phone_hash,
            'nickname' => $user->nickname,
            'is_private' => (bool)$user->is_private,
            'isAppNotificationsEnabled' => (bool)$user->is_notification_app,
            'isPushNotificationsEnabled' => (bool)$user->is_notification_push,
            'last_notification_seen' => $user->last_notification_seen,
            'onboarding_done' => (bool)$user->is_on_boarding_done,
        ];

        if ($user->avatar) {
            $result['image_url'] = $user->avatar->getAwsFullPath();

            if ($original_avatar = $user->originalAvatarUrl())
                $result['original_image_url'] = $original_avatar;
        }

        return $result;
    }

    /**
     * @param string $phoneHash
     * @param array $contactFromStorage
     *
     * @return array
     */
    public static function objectDummyUser($phoneHash, $contactFromStorage)
    {
        $result = [
            "phone_hash" => $phoneHash,
            "nickname" => $contactFromStorage['name'],
            "is_invited" => false,

            "phone_code" => (string)$contactFromStorage['phone_code'],
            "phone_number" => (string)$contactFromStorage['phone_number'],
        ];

        return $result;
    }

    /**
     * @param User $user
     *
     * @return array
     */
    public static function objectMentionedUser(User $user)
    {
        $result = [
            "user_id" => $user->uuid,
            "nickname" => $user->nickname,
        ];

        if ($user->avatar) {
            $result['image_url'] = $user->avatar->getAwsFullPath();

            if ($original_avatar = $user->originalAvatarUrl())
                $result['original_image_url'] = $original_avatar;
        }

        return $result;
    }

    /**
     * @param $user_uuid
     * @return array
     */
    public static function objectMentionedUserDeleted($user_uuid)
    {
        return [
            'user_id' => $user_uuid,
            'deleted' => true
        ];
    }

    /**
     * @param User $user
     * @param User $auth_user
     * @return array
     */
    public static function searchResult(User $user, User $auth_user)
    {
        $is_follower = FollowerRepository::init()->isFollower($user, $auth_user);
        $is_following = FollowerRepository::init()->isFollowing($user, $auth_user);

        $result = [
            'user_id' => $user->uuid,
            'nickname' => $user->nickname,
            'is_follower' => $is_follower,
            'is_following' => $is_following
        ];

        if ($user->is_private) {
            $is_invited = FollowerRepository::init()->isInvited($user, $auth_user);
            $result['is_invited'] = $is_invited;
        }

        if ($user->avatar) {
            $result['image_url'] = $user->avatar->getAwsFullPath();

            if ($original_avatar = $user->originalAvatarUrl())
                $result['original_image_url'] = $original_avatar;
        }

        return $result;
    }
}