<?php namespace Eae\Services;

use Amnesty;
use DB;
use Eae\Transformation\Transformer\Frontend\GalleryTransformer;
use TransformService;
use User;


class GalleryService
{

  public function getImages($filterIds = [], $amount = 32, $hq = FALSE)
  {
    $images = $this->_getImages($filterIds, $amount, $hq);
    $ids = !empty($images) ? array_column($images, 'id') : [];

    $result['images'] = $images;
    $result['ids'] = $ids;

    if (!empty($filterIds)) {
      $result['ids'] = array_merge($result['ids'], $filterIds);
    }

    return $result;
  }

  public function getBestPerformingImages($take = 3)
  {

    $bestPerformingImages = $this->_getBestPerforming($take);
    $ids = !empty($bestPerformingImages) ? array_column($bestPerformingImages, 'id') : [];

    $result['images'] = $bestPerformingImages;
    $result['ids'] = $ids;

    return $result;

  }

  public function getUserImage($userID)
  {

    $userImage = $this->_getUserImage($userID);
    $ids = !empty($userImage) ? array_column($userImage, 'id') : [];

    $result['images'] = $userImage;
    $result['ids'] = $ids;

    return $result;

  }

  public function getShareImage($userID)
  {
    $userImage = $this->_getShareImage($userID);

    return $userImage;

  }

  public function updateActivityCounter($incrementValue = 17)
  {
    DB::beginTransaction();
    try {
      $this->_updateActivityCounter($incrementValue);
      DB::commit();
    } catch (Exception $e) {
      DB::rollback();
      Log::error($e);
      throw($e);
    }
  }

  public function getActivityCounter()
  {
    $activityCounter = $this->_getActivityCounter();

    return $activityCounter;
  }

  private function _getImages($filterIds = [], $amount = 32, $hq = FALSE)
  {
    $query = User::full()
      ->join('submissions', 'users.id', '=', 'submissions.user_id')
      ->select('users.*')
      ->whereNotNull('submissions.final_image_id')
      ->with(
        [
          'submissions' => function ($query) use ($hq) {
            $query->full()->with('finalImage')
              ->whereNotNull('submissions.final_image_id');

            if ((bool)$hq) {
              $query->where('submissions.high_quality', '=', 1);
            }
          }
        ]
      )->latest('users.created_at');

    if ((bool)$hq) {
      $query->where('submissions.high_quality', '=', 1);
    }

    if (!empty($filterIds)) {
      $query->whereNotIn('users.id', $filterIds);
    }

    $query->take($amount);

    $users = $query->get();

    $images = [];
    if ($users) {
      foreach ($users as $userItem) {
        $userItem = TransformService::transformItem(
          $userItem,
          new GalleryTransformer(FALSE)
        )->toArray();
        $images[] = $userItem;
      }
    }

    return $images;
  }

  private function _getBestPerforming($take = 3)
  {
    $query = User::join('trackings', 'trackings.user_id', '=', 'users.id')
      ->orderBy('trackings.page_views', 'desc')
      ->select('users.id', 'users.email', 'trackings.page_views')// just to avoid fetching anything from joined table
      ->join('submissions', 'users.id', '=', 'submissions.user_id')
      ->whereNotNull('submissions.final_image_id')
      ->with([
        'submission' => function ($query) {
          $query->full()->with('finalImage');
        }
      ])
      ->take(50);

    $users = $query->get();

    $users = $users->random($take);

    $topPerformed = [];

    if ($users) {
      foreach ($users as $userItem) {
        $userItem = TransformService::transformItem(
          $userItem,
          new GalleryTransformer(TRUE)
        )->toArray();
        $topPerformed[] = $userItem;
      }
    }

    return $topPerformed;
  }

  private function _getUserImage($userID)
  {
    $query = User::join('trackings', 'trackings.user_id', '=', 'users.id')
      ->orderBy('trackings.page_views', 'desc')
      ->select('users.id', 'users.email', 'trackings.page_views')// just to avoid fetching anything from joined table
      ->join('submissions', 'users.id', '=', 'submissions.user_id')
      ->whereNotNull('submissions.final_image_id')
      ->where('users.id', $userID)
      ->with([
        'submission' => function ($query) {
          $query->full()->with('finalImage');
        }
      ])
      ->take(1);

    $users = $query->get();

    $topPerformed = [];

    if ($users) {
      foreach ($users as $userItem) {
        $userItem = TransformService::transformItem(
          $userItem,
          new GalleryTransformer(TRUE)
        )->toArray();
        $topPerformed[] = $userItem;
      }
    }

    return $topPerformed;
  }

  private function _getShareImage($userID)
  {
    $query = User::where('users.id', $userID)
      ->with([
        'submission' => function ($query) {
          $query->full()->with('finalImage');
        }
      ]);
    $user = $query->first();

    if (!$user) {
      return '';
    }

    $userSubmission = $user->submission;

    $image = '';
    if(isset($user->submission->finalImage)) {
      $image = getMediaUrl($userSubmission->finalImage->filename, 'Resize384x384');
    }


    return $image;
  }

  private function _updateActivityCounter($incrementValue)
  {

    // TODO:: Check Jira for rest of the definition.
    $amnestyConfig = Amnesty::findOrFail(1);
    $amnestyConfig->activity_counter += $incrementValue;
    $amnestyConfig->save();
  }

  private function _getActivityCounter()
  {
    $activityCounter = 0;
    $amnestyConfig = Amnesty::findOrFail(1);

    if ($amnestyConfig) {
      $activityCounter = $amnestyConfig->activity_counter;
    }

    return $activityCounter;
  }
}
