<?php namespace JasonWilliams\Feed\Components;

use Cms\Classes\ComponentBase;
use JasonWilliams\Feed\Models\FeedItem;
use JasonWilliams\Feed\Models\Tags;

class ShortFeed extends ComponentBase
{
    private $channelfilter;

    public function componentDetails()
    {
        return [
            'name'        => 'Short Feed',
            'description' => 'Displays a mini-feed of the most recent feed items, loaded with other page content'
        ];
    }

    public function defineProperties()
    {
      return [
        'channelFilter' => [
          'title'       => 'Channels',
          'description' => 'A comma-separated list of channels to include in feed.',
          'type'        => 'string',
          'default'     => ''
        ],
        'tagFilter' => [
          'title'       => 'Tag',
          'description' => 'The tag to display in the feed.',
          'type'        => 'string',
          'default'     => ''
        ],
        'maxItems' => [
          'title'             => 'Max items',
          'description'       => 'How many feed items should be displayed?',
          'default'           => 10,
          'type'              => 'string',
          'validationPattern' => '^[0-9]+$',
          'validationMessage' => 'The Max items property must be numeric'
        ]
      ];
    }

    public function onRun()
    {
        date_default_timezone_set('America/Edmonton');

        // Set up the results query
        $results = FeedItem::orderBy('timestamp', 'desc')->take($this->property('maxItems'));

        // Do we need to filter based on a tag?
        if ($this->property('tagFilter') != null)
        {
          $results->join('jasonwilliams_feed_tags', 'jasonwilliams_feed_.id', '=', 'jasonwilliams_feed_tags.feed_item_id');
          $results->where('tag', $this->property('tagFilter'));
        }

        // Do we need to filter based on the channel?
        if ($this->property('channelFilter') != null && $this->property('channelFilter') != 'all')
        {
          $this->channelfilter = explode(',', $this->property('channelFilter'));

          $results->whereHas('channel', function($q) {
            $firstchannel = true;

            foreach ($this->channelfilter as $channel)
            {
              if ($firstchannel) $q->where('slug', $channel);
              else $q->orWhere('slug', $channel);

              $firstchannel = false;
            }
          });
        }

        $this->page['posts'] = $results->get();
    }
}