<?php

/**
 * ArtLayout for Contao
 *
 * Copyright (c) 2016 Benjamin Roth
 *
 * @link    http://www.esales-media.de
 * @license commercial
 */

/**
 * Callbacks
 */
$GLOBALS['TL_DCA']['tl_content']['fields']['type']['options_callback'] = array('tl_content_eSM_artLayout','getContentElements');
$GLOBALS['TL_DCA']['tl_content']['config']['onload_callback'][] = array('tl_content_eSM_artLayout','setDefault');


/**
 * Provide miscellaneous methods that are used by the data configuration array.
 *
 * @author Benjamin Roth <http://www.esales-media.de>
 */
class tl_content_eSM_artLayout extends \Backend
{

  /**
   * Import the back end user object
   */
  public function __construct()
  {
    parent::__construct();
    $this->import('BackendUser', 'User');
  }

  /**
   * Return all allowed content elements
   *
   * @param DataContainer $dc
   *
   * @return array
   */
  public function getContentElements(\DataContainer $dc)
  {
    $groups = array();


    if ($dc->activeRecord->ptable == 'tl_article')
    {
      // Get article model
      $Article = \ArticleModel::findByPk($dc->activeRecord->pid);

      // Check for article layout
      if ($Article->es_type)
      {
        // Get layout model
        $ArticleLayout = \ArticleLayoutsModel::findByPk($Article->es_type);

        // Build array of allowed elements if restriction is set
        if ($ArticleLayout !== null && $ArticleLayout->restrictContentElements)
        {
          $arrAllowedCTE = deserialize($ArticleLayout->allowedElements, true);
        }
      }

      // Build elements groups
      foreach ($GLOBALS['TL_CTE'] as $k => $v)
      {
        foreach (array_keys($v) as $kk)
        {

          // Skip not allowed elements
          if (isset($arrAllowedCTE))
          {
            if (!in_array($kk, $arrAllowedCTE))
            {
              continue;
            }
          }
          $groups[$k][] = $kk;
        }
      }
    } else {
      foreach ($GLOBALS['TL_CTE'] as $k=>$v)
      {
        foreach (array_keys($v) as $kk)
        {
          $groups[$k][] = $kk;
        }
      }
    }

    return $groups;
  }

  /**
   * Set default type value
   *
   * @param DataContainer $dc
   */
  public function setDefault(\DataContainer $dc)
  {
    if ($_GET['act'] == 'edit')
    {
      $ContentElement = \ContentModel::findByPk($dc->id);

      if ($ContentElement !== null)
      {

        $dc->activeRecord = $ContentElement;
        $arrGroups = $this->getContentElements($dc);

        if (count($arrGroups))
        {
          $blnDefaultAvailable = false;

          foreach ($arrGroups as $k => $v)
          {
            if (in_array($ContentElement->type, $v))
            {
              $blnDefaultAvailable = true;
            }
          }

          if (!$blnDefaultAvailable)
          {
            $varValue = reset(reset($arrGroups));

            \Database::getInstance()->prepare("UPDATE tl_content SET type = ? WHERE id = ?")->execute($varValue,$dc->id);
            $this->reload();
          }
        }
      }
    }
  }

}