<?php

namespace App\Packages\Capsule\Transformer;

use App\Packages\Capsule\Models\Capsule;
use App\Packages\Capsule\Models\CapsuleComment;
use App\Packages\Capsule\Models\CapsuleOpen;
use App\Packages\Capsule\Models\CapsulePreview;
use App\Packages\Capsule\Repository\CapsuleCommentRepository;
use App\Packages\Capsule\Repository\CapsuleLikeRepository;
use App\Packages\Capsule\Repository\CapsuleSubscriberRepository;
use App\Packages\Core\Models\Address;
use App\Packages\User\Transformer\UserTransformer;

/**
 * Class CapsulePublicTransformer
 * @package App\Packages\Capsule\Transformer
 */
class CapsulePublicTransformer {

    public static function mainCapsule(Capsule $capsule) {
        $user = $capsule->user;

        $countComments = CapsuleCommentRepository::init()->capsuleCommentsCount($capsule);
        $countLikes = CapsuleLikeRepository::init()->capsuleLikesCount($capsule);
        $countSubscribers = CapsuleSubscriberRepository::init()->capsuleSubscribersCount($capsule);

        $canBeOpened = $capsule->canBeOpened();

        $result = [
            "cap_id" => $capsule->id,
            "id" => $capsule->uuid,

            "capsule_status" => $capsule->status,
            "media_url" => ($canBeOpened) ? $capsule->getMediaUrl() : null,

            "is_private" => (bool)$capsule->is_private,
            "opens_at" => $capsule->getFormattedOpenTime(),
            "diff_time" => $capsule->getDiffOpenDate(),
            "caption" => $capsule->caption,
            "has_mentions" => false,
            "is_complete" => $capsule->is_complete,
            "is_blocked" => $capsule->blocked,

            "created_at" => $capsule->getPublicCreatedDate(),

            "owner" => UserTransformer::smallObject($capsule->user),

            "count_comment" => (int)$countComments,
            "count_like" => (int)$countLikes,
            "count_subscribers" => (int)$countSubscribers,
        ];

        $comments = CapsuleCommentRepository::init()->capsuleComments($capsule);
        $comments = $comments->map(function (CapsuleComment $comment) use ($user) {
            return CapsuleCommentTransformer::commentPublic($comment);
        });

        $result['comments'] = $comments;

        if ($capsule->preview) {
            $result['image'] = static::imageFullObject($capsule->preview);
        } elseif ($capsule->cropped) {
            $result['image'] = static::imageFullObject($capsule->cropped);
        } elseif ($capsule->thumbnail) {
            $result['image'] = static::imageFullObject($capsule->thumbnail);
        }

        if ($capsule->address) {
            $result['address'] = static::addressFullObject($capsule->address);
        }

        return $result;
    }

    /**
     * @param Address $address
     *
     * @return array
     */
    public static function addressFullObject(Address $address) {
        return [
            "id" => $address->google_place_id,
            "lat" => $address->lat,
            "lng" => $address->lng,
            "vicinity" => $address->user_input,

            "street_title" => $address->street_title,
            "street_number" => $address->street_number,
            "country_title" => $address->country_title,
            "full_address" => $address->full_string,
            "city" => $address->city,
        ];
    }

    /**
     * @param CapsulePreview $thumbnail
     *
     * @return array
     */
    public static function imageFullObject(CapsulePreview $thumbnail) {
        return [
            'width' => (int)$thumbnail->width,
            'height' => (int)$thumbnail->height,
            'url' => previewAwsPathCDN($thumbnail->aws_key),
        ];
    }

}