<?php
  use Eae\Exception\InvalidConfigurationException;

  class GenericController extends Controller
  {

    /*
    | Default controller - grabs all unattended routes and tries to fulfill
    | the request by looking to the backoffice generic pages
    */

    public function getIndex()
    {
      return $this->missingMethod();
    }

    public function missingMethod($parameters = [])
    {
      $uri = '/' . implode('/', $parameters);

      //If root, $parameters comes with 2 empty strings (don't know why) so we improvise
      $uri = $uri == '//' ? '/' : $uri;
      $lang = getActiveLanguage();

      $websiteObject = WebsiteObject::whereRaw("? like concat(lang_uri, '/%')", [$uri . '/'])
        ->whereNotNull('template')
        ->join('website_objects_lang', 'website_objects_lang.website_object_id', '=', 'website_objects.website_object_id')
        ->where('website_objects_lang.wo_language_id', $lang)
        ->orderByRaw("(length( lang_uri ) - length( replace(lang_uri, '/', ''))) desc")
        ->orderByRaw("length(lang_uri) desc")
        ->first();

      if (!$websiteObject) {
        App::abort(404);
      }

      if ($websiteObject->status != 'published') {
        $user = Auth::backend()->user();
        if (!$user) {
          App::abort(404);
        }
      }

      //Gets alternative language uris
      $langUris = [];
      $langs = getAvailableLanguages();
      if (sizeof($langs) > 1) {
        $langWOs = DB::table('website_objects_lang AS wo1')
          ->select(['wo1.wo_language_id', 'wo1.lang_uri'])
          ->join('website_objects_lang AS wo2', 'wo1.website_object_id', '=', 'wo2.website_object_id')
          ->join('website_objects AS wo', 'wo.website_object_id', '=', 'wo2.website_object_id')
          ->where('wo2.lang_uri', $uri)
          ->get();

        foreach ($langWOs as $langWO) {
          $langUris[ $langWO->wo_language_id ] = $langWO->lang_uri;
        }
      }

      $object = $websiteObject->objectable;
      $contentType = $websiteObject->content_type;
      $templateId = $websiteObject->template;

      $template = Config::get('backoffice/generic/' . $contentType . '.templates.' . $templateId);

      if (!$template) {
        throw new InvalidConfigurationException("You must provide a configuration");
      }

      $allowedParameters = 0;
      if (isset($template['parameters'])) {
        $allowedParameters = $template['parameters'];
      }
      $inputParameters = sizeof(explode('/', $uri)) - sizeof(explode('/', $websiteObject->uri));

      if ($allowedParameters < $inputParameters) {
        App::abort(404);
      }

      if ($inputParameters > 0 && isset($template['detailView'])) {
        $view = $template['detailView'];
      } else {
        $view = $template['view'];
      }

      // Check for Project Specific parameters
      $metaUser = $this->_checkUtms();

      $view = View::make($view)
        ->with([
          'object'        => $object,
          'parameters'    => $parameters,
          'websiteObject' => $websiteObject,
          'langUris'      => $langUris,
          'metaUser'      => $metaUser
        ]);

      return Response::make($view);
    }

    private function _checkUtms()
    {
      $data = [
        'utmHash'   => Input::get('utm_content'),
        'utmSource' => Input::get('utm_source')
      ];

      $rules = [
        'utmHash'   => 'exists:trackings,hash'
      ];

      $validator = Validator::make(
        $data,
        $rules
      );

      if ($validator->fails()) {
        RETURN [];
      }

      $tracking = Tracking::hash($data['utmHash'])->first();

      if (!$tracking) {
        RETURN [];
      }

      $userShareLink = '';
      if ($data['utmSource'] == 'twitter') {
        $userShareLink = $tracking->bitly_twitter;
      } else if ($data['utmSource'] == 'facebook') {
        $userShareLink = $tracking->bitly_facebook;
      } else if ($data['utmSource'] == 'pinterest') {
        $userShareLink = $tracking->bitly_pinterest;
      } else {
        $userShareLink = $tracking->bitly_facebook;
      }


      $userImage = GalleryService::getShareImage($tracking->user_id);

      DB::beginTransaction();
      try {
        $tracking->increment('page_views');
        $tracking->save();
        DB::commit();
      } catch (Exception $e) {
        DB::rollback();
        Log::error($e);
      }

      $response = [
        'userImage'     => $userImage,
        'userShareLink' => $userShareLink
      ];

      return $response;
    }
  }
