<?php

namespace App\Packages\User\Transformer;

use App\Packages\Capsule\Services\CapsuleProfileService;
use App\Packages\Friend\Models\FriendInvite;
use App\Packages\Friend\Models\FriendRelation;
use App\Packages\Friend\Repository\FriendInviteRepository;
use App\Packages\Friend\Repository\FriendRepository;
use App\Packages\User\Models\User;
use stdClass;

/**
 * @TODO: Remove phone code, number from response objects, test case
 *
 * Class UserTransformer
 * @package App\Packages\User\Transformer
 */
class UserTransformer
{
    /**
     * @param User $user
     *
     * @return array
     */
    public static function smallObject(User $user)
    {
        $result = [
            "user_id" => $user->uuid,
            "id" => $user->uuid,
            "name" => $user->nickname,
            "phone_hash" => (string)$user->phone_hash,
            "phone_code" => (string)$user->phone_code,
            "phone_number" => (string)$user->phone_number,
            "is_registered" => (bool)$user->is_registered,
        ];

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

        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,
            "id" => $user->uuid,
            "name" => $user->nickname,
            "phone_hash" => (string)$user->phone_hash,
            "phone_code" => (string)$user->phone_code,
            "phone_number" => (string)$user->phone_number,
            "is_registered" => (bool)$user->is_registered,
        ];

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

        //if ($user->id != $watcherUser->id) {
            $isFriend = FriendRepository::init()->existsFriend($user, $watcherUser);
            $isInvited = FriendInviteRepository::init()->existsInvite($user, $watcherUser);

            $result["is_friend"] = (bool)$isFriend;
            $result["is_invited"] = (bool)$isInvited;
        //}

        return $result;
    }

    /**
     * @param User $user
     * @param User $watcherUser - invited by user or is friend - user who watches
     *
     * @return array
     */
    public static function objectUserProfile(User $user, User $watcherUser)
    {
        /** Add cache */
        $friendsCount = FriendRepository::init()->getFriendCount($user);

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

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

            "count_capsules" => $capsuleCount,
            "count_friends" => $friendsCount,

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

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

        if ($user->id != $watcherUser->id) {
            $isFriend = FriendRepository::init()->existsFriend($user, $watcherUser);
            $isInvited = FriendInviteRepository::init()->existsInvite($user, $watcherUser);

            $result["is_friend"] = (bool)$isFriend;
            $result["is_invited"] = (bool)$isInvited;
        }

        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,
            '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();
            $result['original_image_url'] = $user->avatar->getAwsFullPath();
        }

        return $result;
    }

    /**
     * @param stdClass $user
     *
     * @return array
     */
    public static function objectFriendUserList($user)
    {
        $result = [
            "user_id" => $user->uuid,
            "id" => $user->uuid,
            "name" => $user->nickname,
            "phone_hash" => $user->phone_hash,
            "is_friend" => true,
            "is_invited" => false,

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

        if ($user->awsKey) {
            $result['image_url'] = avatarAwsPath($user->awsKey);
        }

        return $result;
    }

    /**
     * @param stdClass $user
     * @param array $contactFromStorage
     *
     * @return array
     */
    public static function objectContactFlyUserList($user, $contactFromStorage)
    {
        $result = [
            "user_id" => $user->uuid,
            "id" => $user->uuid,
            "phone_hash" => $user->phone_hash,
            "name" => $contactFromStorage['name'],
            "is_friend" => (bool)$user->isFriend,
            "is_invited" => (bool)$user->isInvited,

            "phone_code" => (string)$contactFromStorage['phone_code'],
            "phone_number" => (string)$contactFromStorage['phone_number'],
            "is_registered" => (bool)$user->is_registered,
        ];

        if ($user->awsKey) {
            $result['image_url'] = avatarAwsPath($user->awsKey);
        }

        return $result;
    }

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

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

        return $result;
    }

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

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

        return $result;
    }

    public static function objectMentionedUserDeleted($user_uuid)
    {
        return [
            'user_id' => $user_uuid,
            'id' => $user_uuid,
            'deleted' => true
        ];
    }
}