<?php
/**
 * Badges data interface
 *
 * @module Autogedal_Badges
 * @author Malith Priyashan
 * @package Autogedal\Badges\Block
 * @licence OSL 3.0
 */

namespace Autogedal\Badges\Block;

use Magento\Framework\View\Element\Template;
use Magento\Framework\DataObject\IdentityInterface;
use Magento\Framework\View\Element\Template\Context;
use Magento\Customer\Model\Session as CustomerSession;
use Autogedal\Badges\Model\Badge;
use Autogedal\Badges\Api\Data\BadgeInterface;
use Autogedal\Badges\Model\ResourceModel\Badge\Collection as BadgeCollection;
use Autogedal\Badges\Model\ResourceModel\Badge\CollectionFactory as BadgesCollectionFactory;

/**
 * Class BadgesList
 */
class BadgesList extends Template implements IdentityInterface
{
    /**
     * @var BadgesCollectionFactory
     */
    protected $badgeCollectionFactory;

    /**
     * @var CustomerSession
     */
    protected $customerSession;

    /**
     * Construct
     *
     * @param BadgesCollectionFactory $badgeCollectionFactory ,
     * @param CustomerSession $session
     * @param Context $context
     * @param array $data
     */
    public function __construct(
        BadgesCollectionFactory $badgeCollectionFactory,
        CustomerSession $session,
        Context $context,
        array $data = []
    ) {
        $this->badgeCollectionFactory = $badgeCollectionFactory;
        $this->customerSession = $session;

        parent::__construct($context, $data);
    }

    /**
     * Gets the badges from database saves in local variable for caching
     *
     * @return BadgeCollection
     */
    public function getBadges()
    {
        // Check if Badges has already been defined
        if (!$this->hasData('badges')) {
            $badgesCollection = $this->badgeCollectionFactory
                ->create()
                ->addFilter('is_active', 1)
                ->addOrder(
                    BadgeInterface::CREATION_TIME,
                    BadgeCollection::SORT_ORDER_DESC
                );

            $this->setData('badges', $badgesCollection);
        }

        return $this->getData('badges');
    }

    /**
     * Return identifiers for produced content
     *
     * @return array
     */
    public function getIdentities()
    {
        return [Badge::CACHE_TAG . '_' . 'list'];
    }

    /**
     * Check if customer is logged in
     *
     * @return bool
     */
    public function getCustomerStatus()
    {
        return $this->customerSession->isLoggedIn();
    }
}
