<?php

/**
 * Slick slider for Contao
 *
 * Copyright (c) 2016 Benjamin Roth
 *
 * @license LGPL-3.0+
 */

namespace eSM_slick;

/**
 * Front end content element slick slider start.
 */
class ContentSlickSliderImage extends \ContentElement
{

	/**
	 * Template
	 * @var string
	 */
	protected $strTemplate = 'ce_slick_slider_image';

  /**
   * @return string
   */
  public function generate()
  {
    if (TL_MODE == 'BE')
    {
      $return = '';

      if ($this->multiSRC)
      {

        $source = \StringUtil::deserialize($this->multiSRC);
        $objFiles = \FilesModel::findMultipleByUuids($source);

        if ($objFiles !== null)
        {
          foreach ($objFiles as $file)
          {
            if (is_file(TL_ROOT . '/' . $file->path))
            {
              if (in_array($file->extension, array_map('trim', explode(',', \Config::get('validImageTypes')))))
              {
                $src = \System::getContainer()->get('contao.image.image_factory')->create(TL_ROOT . '/' . $file->path, array(66, 55, 'crop'))->getUrl(TL_ROOT);
                $return .= '<img src="' . $src . '">'."\n";
              } else if (in_array($file->extension, array_map('trim', array('mp4', 'm4v', 'mov', 'wmv', 'webm', 'ogv', 'm4a', 'mp3', 'wma', 'mpeg', 'wav', 'ogg')))) {
                $return .= '<span>'.$GLOBALS['TL_LANG']['tl_content']['singleSRC'][0].': <a href="'.$file->path.'" target="_blank">'.$file->name.'</a></span>'."\n";
              }
            }
          }
        }
      }

      return $return;
    }

    $parentKey = ($this->arrData['ptable'] ?: 'tl_article') . '__' . $this->arrData['pid'];

    if (isset($GLOBALS['TL_ESM_SLICK'][$parentKey]))
    {
      $this->arrData['parentSlickId'] = $GLOBALS['TL_ESM_SLICK'][$parentKey];
    } else {
      $this->arrData['parentSlickId'] = 0;
    }


    return parent::generate();
  }

  /**
   * Generate the content element
   */
  protected function compile()
  {
    if (TL_MODE == 'BE')
    {
      $this->strTemplate = 'be_wildcard';

      /** @var \BackendTemplate|object $objTemplate */
      $objTemplate = new \BackendTemplate($this->strTemplate);

      $this->Template = $objTemplate;
    }

    if ($this->multiSRC)
    {

      $source = \StringUtil::deserialize($this->multiSRC);
      $objFiles = \FilesModel::findMultipleByUuids($source);

      $imageFiles = array();
      $videoFiles = array();

      if ($objFiles !== null) {

        foreach ($objFiles as $file) {
          if (is_file(TL_ROOT . '/' . $file->path))
          {
            if (in_array($file->extension, array_map('trim', explode(',', \Config::get('validImageTypes')))))
            {
              $imageFiles[] = $file;
            } else if (in_array($file->extension, array_map('trim', array('mp4', 'm4v', 'mov', 'wmv', 'webm', 'ogv', 'm4a', 'mp3', 'wma', 'mpeg', 'wav', 'ogg'))))
            {
              $videoFiles[] = $file;
            }
          }
        }
      }

      if (isset($imageFiles[0]))
      {
        $this->singleSRC = $imageFiles[0]->path;

        $this->addImageToTemplate($this->Template, array('singleSRC'=>$this->singleSRC, 'size'=>$this->size));

        $backgroundStyle = '';

        if ($this->eSM_slick_minHeight) {
          if ($this->eSM_slick_bgSize && $this->eSM_slick_bgSize == 'auto auto') {
            $minHeight = $this->Template->picture['img']['height'] . 'px';
          } else
          {
            $minHeight = round($this->Template->picture['img']['height'] / $this->Template->picture['img']['width'] * 100) . '%';
          }
          $backgroundStyle .= '.slide_'.$this->id.':before { content: ""; display: block; float: left; padding-top: '.$minHeight.'; }';
        }


        $backgroundStyle .= '.slide_'.$this->id.' .slick-slider-slide-image { background-image: url(\''.$this->Template->src.'\');';

        if ($this->eSM_slick_bgSize) {
          $backgroundStyle .= 'background-size: ' . $this->eSM_slick_bgSize . ';';
        } else {
          $backgroundStyle .= 'background-size: cover;';
        }
        if ($this->eSM_slick_bgPosition) {
          $backgroundStyle .= 'background-position: ' . $this->eSM_slick_bgPosition . ';';
        } else {
          $backgroundStyle .= 'background-position: 0 0;';
        }
        if ($this->eSM_slick_bgOpacity) {
          $backgroundStyle .= 'opacity:' . $this->eSM_slick_bgOpacity/100 . ';';
        }
        if ($this->eSM_slick_bgRepeat) {
          $backgroundStyle .= 'background-repeat: ' . $this->eSM_slick_bgRepeat . ';';
        }

        $this->Template->backgroundStyle = $backgroundStyle.' }';

        // Responsive handling
        if ($this->Template->picture['sources'] && is_array($this->Template->picture['sources']))
        {
          $backgroundStyleResponsive = '';
          foreach ($this->Template->picture['sources'] as $srcSet)
          {
            $srcSetStyle = '.slide_'.$this->id.' .slick-slider-slide-image { background-image: url(\''.$srcSet['src'].'\'); }';

            if ($this->eSM_slick_minHeight) {
              if ($this->eSM_slick_bgSize && $this->eSM_slick_bgSize == 'auto auto') {
                $minHeight = $srcSet['height'] . 'px';
              } else
              {
                $minHeight = round($srcSet['height'] / $srcSet['width'] * 100) . '%';
              }
              $srcSetStyle .= '.slide_'.$this->id.':before { content: ""; display: block; float: left; padding-top: '.$minHeight.'; }';
            }

            $backgroundStyleResponsive .= '@media screen and '.$srcSet['media'].' { '.$srcSetStyle.' }';
          }
          $this->Template->backgroundStyleResponsive = $backgroundStyleResponsive;
        }

      }

      if (count($videoFiles)) {
        $this->Template->videoFiles = $videoFiles;
      }
    }

    if ($this->eSM_slick_addImageLink)
    {
      $this->Template->lightboxId = 'image_slide_' . ($this->parentSlickId ?: 's'.$this->id);
      $this->Template->fullsize = $this->fullsize;
      $this->Template->imageLink = ($this->imageUrl ?: $this->singleSRC);
    }

    if ($this->eSM_addText)
    {
      $this->Template->text = nl2br($this->eSM_slick_text);
      $this->Template->link = $this->eSM_slick_url;
    }

  }

}