<?php namespace Eae\Composers\Frontend;

use CfPageHome;
use GalleryService;
use Input;
use Tracking;

class HomepageComposer
{

  public function compose($view)
  {
    $viewData = $view->getData();
    $entryID = NULL;
    $parameters = '';
    $slug = '';

    if (isset($viewData['object'])) {
      $viewObject = $viewData['object'];
      $entryID = $viewObject['entry_id'];
      $parameters = $viewData['parameters'];
      $slug = last($parameters);
    }

    $cfPageHome = CfPageHome::full()
      ->where('entry_id', $entryID)
      ->where('status', 'published')
      ->first();

    $userImage = NULL;
    if ( Input::has('user_image')) {
      $userImage = Input::get('user_image');
    } else if (Input::has('utm_content')) {
      $userImage = Input::get('utm_content');
    }

    $leadBlock = $this->_buildLeadBlock($cfPageHome);
    $imageBlock = $this->_buildImageBlock($cfPageHome);
    $videoBlock = $this->_buildVideoBlock($cfPageHome);
    $galleryBlock = $this->_buildGalleryBlock($userImage);
    $activityCounter = GalleryService::getActivityCounter();

    $view->with([
      'leadBlock'       => $leadBlock,
      'imageBlock'      => $imageBlock,
      'videoBlock'      => $videoBlock,
      'galleryBlock'    => $galleryBlock,
      'activityCounter' => $activityCounter
    ]);
  }

  protected function _buildLeadBlock($cfPageHome)
  {

    if (!$cfPageHome) {
      return [];
    }

    $leadBlock = [];
    $leadBlock['title'] = nl2br($cfPageHome->cf_lead_title);
    $leadBlock['subtitle'] = nl2br($cfPageHome->cf_lead_subtitle);
    $leadBlock['cta'] = $cfPageHome->cf_cta;
    $leadBlock['cta_url'] = $cfPageHome->cf_cta_url;

    return $leadBlock;
  }

  protected function _buildImageBlock($cfPageHome)
  {

    if (!$cfPageHome) {
      return [];
    }

    $imageBlock = [];
    $imageBlock['title'] = nl2br($cfPageHome->cf_image_title);
    $imageBlock['subtitle'] = nl2br($cfPageHome->cf_image_subtitle);
    $imageBlock['cta'] = $cfPageHome->cf_image_cta;
    $imageBlock['cta_url'] = $cfPageHome->cf_image_cta_url;
    $imageBlock['image'] = (isset($cfPageHome->cf_image_id)) ? getMediaUrl($cfPageHome->cf_image->filename, 'Resize870xAuto') : NULL;

    return $imageBlock;
  }

  protected function _buildVideoBlock($cfPageHome)
  {

    if (!$cfPageHome) {
      return [];
    }

    $videoBlock = [];
    $videoBlock['title'] = nl2br($cfPageHome->cf_video_title);
    $videoBlock['cta'] = $cfPageHome->cf_video_cta;
    $videoBlock['cta_url'] = $cfPageHome->cf_video_cta_url;
    $videoBlock['video'] = $cfPageHome->cf_video_url;

    return $videoBlock;
  }

  private function _buildGalleryBlock($hash = NULL)
  {
    $result = [];
    $takeBestPerforming = 3;
    $userImage = NULL;

    $userID = $this->_getUserID($hash);

    if ($userID) {
      $userImage = GalleryService::getUserImage($userID);

      if ($userImage && isset($userImage['ids'][0])) {
        $takeBestPerforming = 2;
      }
    }

    // Best performing images
    $bestPerformingImages = GalleryService::getBestPerformingImages($takeBestPerforming);

    $filterIDS = $bestPerformingImages['ids'];

    if ($userImage && isset($userImage['ids'][0])) {
      $filterIDS[] = $userImage['ids'][0];
    }

    // 32 more images without the ones best performing
    $images = GalleryService::getImages($filterIDS);

    // isolate best performing images
    $bestPerformingImages = $bestPerformingImages['images'];

    if ($userImage && isset($userImage['ids'][0])) {
      array_unshift($bestPerformingImages, $userImage['images'][0]);
    }

    // get extra 12 images
    $extraImages = GalleryService::getImages($images['ids'], 12);

    // prepare result
    $result['bestPerformingImages'] = $bestPerformingImages;
    $result['images'] = $images['images'];
    $result['extraImages'] = $extraImages;

    return $result;
  }

  private function _getUserID($hash)
  {
    $tracking = Tracking::hash($hash)->first();

    if ($tracking) {
      return $tracking->user_id;
    }

    return '';
  }
}
