<?php namespace Eae\Transformation\Transformer;

use League\Fractal;
use Lang;
use Block;
use Carbon\Carbon;
use Eae\Support\WaveGenerator;

class BlockTransformer extends Fractal\TransformerAbstract
{
    protected $year;
    protected $stripListItemsHtml;
    protected $availableIncludes = [
        'gallery',
        'quizzQuestions',
        'listItems'
    ];

    public function __construct($year = NULL, $stripListItemsHtml = FALSE)
    {
        $this->year = NULL;
        if ($year) {
            $this->year = $year;
        }

        $this->stripListItemsHtml = $stripListItemsHtml;
    }

    public function transform(Block $block)
    {
        $out = [];
        $out = $this->_getBlock($block);

        return $out;
    }

    public function includeGallery(Block $block)
    {
        if ($block->type === 'blockMainArticle' || $block->type === 'blockImageAudio') {
            return $this->collection($block->blockGallery, new GalleryTransformer());
        }

        return NULL;
    }

    public function includeQuizzQuestions(Block $block)
    {
        if ($block->type != 'blockQuizz') {
            return NULL;
        }

        return $this->collection($block->quizzQuestions, new QuizzQuestionTransformer());
    }

    public function includeListItems(Block $block)
    {
        if ($block->type !== 'blockListItems') {
            return NULL;
        }

        return $this->collection($block->listItems, new ListItemTransformer($this->stripListItemsHtml));
    }

    private function _getBlock(Block $block)
    {
        $out = [];
        switch ($block->type) {
            case 'blockMainArticle':
                $out = $this->_getMainArticle($block);
                break;
            case 'blockAudio':
                $out = $this->_getBlockAudio($block);
                break;
            case 'blockVideo':
                $out = $this->_getBlockVideo($block);
                break;
            case 'blockQuizz':
                $out = $this->_getBlockQuizz($block);
                break;
            case 'blockTitleDescription':
                $out = $this->_getBlockTitleDescription($block);
                break;
            case 'blockListItems':
                $out = $this->_getBlockListItems($block);
                break;
            case 'blockTitleDescriptionSubtitleAudio':
                $out = $this->_getBlockTitleDescriptionSubtitleAudio($block);
                break;
            case 'blockTitleDescriptionSubtitleVideo':
                $out = $this->_getBlockTitleDescriptionSubtitleVideo($block);
                break;
            case 'blockImageAudio':
                $out = $this->_getBlockImageAudio($block);
                break;
            case 'blockTimeline':
                $out = $this->_getBlockTimeline($block);
                break;
            case 'blockTitleSubtitleLinkImage':
                $out = $this->_getBlockTitleSubtitleLinkImage($block);
                break;
        }

        return $out;
    }

    private function _getMainArticle(Block $block)
    {
        $out = [
            'id'          => (int)$block->id,
            'type'        => $block->type,
            'title'       => $block->block_title,
            'description' => $block->block_description,
            'audio'       => $block->block_audio,
            'peaks'       => $this->_getPeaks($block->block_audio),
            'year'        => $this->year ? Carbon::createFromFormat('Y-m-d', $this->year)->format('Y') : ''
        ];

        return $out;
    }

    private function _getBlockAudio(Block $block)
    {
        $out = [
            'id'    => (int)$block->id,
            'type'  => $block->type,
            'title' => nl2br($block->block_title),
            'audio' => $block->block_audio,
            'peaks' => $this->_getPeaks($block->block_audio),
        ];

        return $out;
    }

    private function _getBlockVideo(Block $block)
    {
        $out = [
            'id'    => (int)$block->id,
            'type'  => $block->type,
            'video' => $block->block_video,
        ];

        return $out;
    }

    private function _getBlockQuizz(Block $block)
    {
        $out = [
            'id'   => (int)$block->id,
            'type' => $block->type,
        ];

        return $out;
    }

    private function _getBlockTitleDescription(Block $block)
    {
        $out = [
            'id'          => (int)$block->id,
            'type'        => $block->type,
            'title'       => nl2br($block->block_title),
            'description' => nl2br($block->block_description)
        ];

        return $out;
    }

    private function _getBlockTitleDescriptionSubtitleAudio(Block $block)
    {
        $out = [
            'id'          => (int)$block->id,
            'type'        => $block->type,
            'title'       => nl2br($block->block_title),
            'description' => nl2br($block->block_description),
            'subtitle'    => nl2br($block->block_subtitle),
            'audio'       => $block->block_audio,
            'peaks'       => $this->_getPeaks($block->block_audio),
        ];

        return $out;
    }

    private function _getBlockTitleDescriptionSubtitleVideo(Block $block)
    {
        $out = [
            'id'          => (int)$block->id,
            'type'        => $block->type,
            'title'       => nl2br($block->block_title),
            'description' => nl2br($block->block_description),
            'subtitle'    => nl2br($block->block_subtitle),
            'video'       => $block->block_video
        ];

        return $out;
    }

    private function _getBlockListItems(Block $block)
    {
        $out = [
            'id'          => (int)$block->id,
            'type'        => $block->type,
            'title'       => nl2br($block->block_title),
            'subtitle'    => nl2br($block->block_subtitle),
            'description' => nl2br($block->block_description)
        ];

        return $out;
    }

    private function _getBlockImageAudio(Block $block)
    {
        $out = [
            'id'    => (int)$block->id,
            'type'  => $block->type,
            'audio' => $block->block_audio,
            'peaks' => $this->_getPeaks($block->block_audio)
        ];

        return $out;
    }

    private function _getBlockTimeline(Block $block)
    {
        $out = [
            'id'   => (int)$block->id,
            'type' => $block->type
        ];

        return $out;
    }

    private function _getBlockTitleSubtitleLinkImage(Block $block)
    {
        $image = $block->blockImage;
        $out = [
            'id'       => (int)$block->id,
            'type'     => $block->type,
            'title'    => $block->block_title,
            'subtitle' => $block->block_subtitle,
            'image'    => isset($image->filename) ? getMediaUrl($image->filename, '1180x610') : '',
            'link'     => link_transform($block->block_cta)
        ];

        return $out;
    }

    private function _getPeaks($audioFile)
    {
        $waveGenerator = new WaveGenerator($audioFile);
        $peaks = $waveGenerator->getPeaksData();

        return $peaks;
    }
}
