<?php

class AudiopreviewController extends Zend_Controller_Action
{
    public function init()
    {
        $ajaxContext = $this->_helper->getHelper('AjaxContext');
        $ajaxContext->addActionContext('show-preview', 'json')
            ->addActionContext('audio-preview', 'json')
            ->addActionContext('get-show', 'json')
            ->addActionContext('playlist-preview', 'json')
            ->addActionContext('get-playlist', 'json')
            ->initContext();
    }

    /**
     * Simply sets up the view to play the required audio track.
     *  Gets the parameters from the request and sets them to the view.
     */
    public function audioPreviewAction()
    {
        $CC_CONFIG = Config::getConfig();

        $audioFileID = $this->_getParam('audioFileID');
        $type = $this->_getParam('type');

        $baseUrl = Config::getBasePath();

        $this->view->headScript()->appendFile(
            Assets::url('js/airtime/audiopreview/preview_jplayer.js'),
            'text/javascript'
        );
        $this->view->headScript()->appendFile(
            Assets::url('js/jplayer/jplayer.playlist.min.js'),
            'text/javascript'
        );
        $this->view->headLink()->appendStylesheet(
            Assets::url('js/jplayer/skin/jplayer.airtime.audio.preview.css')
        );
        $this->_helper->layout->setLayout('audioPlayer');

        $logo = Application_Model_Preference::GetStationLogo();
        if ($logo) {
            $this->view->logo = "data:image/png;base64,{$logo}";
        } else {
            $this->view->logo = $baseUrl . 'css/images/airtime_logo_jp.png';
        }

        if ($type == 'audioclip') {
            $media = Application_Model_StoredFile::RecallById($audioFileID);
            $uri = $baseUrl . 'api/get-media/file/' . $audioFileID;
            $mime = $media->getPropelOrm()->getDbMime();
            $this->view->audioFileArtist = htmlspecialchars($media->getPropelOrm()->getDbArtistName() ?? '');
            $this->view->audioFileTitle = htmlspecialchars($media->getPropelOrm()->getDbTrackTitle() ?? '');
        } elseif ($type == 'stream') {
            $webstream = CcWebstreamQuery::create()->findPk($audioFileID);
            $uri = $webstream->getDbUrl();
            $mime = $webstream->getDbMime();
            $this->view->audioFileTitle = htmlspecialchars($webstream->getDbName() ?? '');
        } else {
            throw new Exception("Unknown type for audio preview!.Type={$type}");
        }

        $this->view->uri = $uri;
        $this->view->mime = $mime;
        $this->view->audioFileID = $audioFileID;

        $this->view->type = $type;

        $this->_helper->viewRenderer->setRender('audio-preview');
    }

    /**
     * Simply sets up the view to play the required playlist track.
     *  Gets the parameters from the request and sets them to the view.
     */
    public function playlistPreviewAction()
    {
        $CC_CONFIG = Config::getConfig();

        $playlistIndex = $this->_getParam('playlistIndex');
        $playlistID = $this->_getParam('playlistID');

        $baseUrl = Config::getBasePath();

        $this->view->headScript()->appendFile(Assets::url('js/airtime/audiopreview/preview_jplayer.js'), 'text/javascript');
        $this->view->headScript()->appendFile(Assets::url('js/jplayer/jplayer.playlist.min.js'), 'text/javascript');
        $this->view->headLink()->appendStylesheet(Assets::url('js/jplayer/skin/jplayer.airtime.audio.preview.css'));
        $this->_helper->layout->setLayout('audioPlayer');

        $logo = Application_Model_Preference::GetStationLogo();
        if ($logo) {
            $this->view->logo = "data:image/png;base64,{$logo}";
        } else {
            $this->view->logo = $baseUrl . 'css/images/airtime_logo_jp.png';
        }
        $this->view->playlistIndex = $playlistIndex;
        $this->view->playlistID = $playlistID;

        $this->_helper->viewRenderer->setRender('audio-preview');
    }

    public function blockPreviewAction()
    {
        $CC_CONFIG = Config::getConfig();

        $blockIndex = $this->_getParam('blockIndex');
        $blockId = $this->_getParam('blockId');

        $baseUrl = Config::getBasePath();

        $this->view->headScript()->appendFile(Assets::url('js/airtime/audiopreview/preview_jplayer.js'), 'text/javascript');
        $this->view->headScript()->appendFile(Assets::url('js/jplayer/jplayer.playlist.min.js'), 'text/javascript');
        $this->view->headLink()->appendStylesheet(Assets::url('js/jplayer/skin/jplayer.airtime.audio.preview.css'));
        $this->_helper->layout->setLayout('audioPlayer');

        $logo = Application_Model_Preference::GetStationLogo();
        if ($logo) {
            $this->view->logo = "data:image/png;base64,{$logo}";
        } else {
            $this->view->logo = $baseUrl . 'css/images/airtime_logo_jp.png';
        }
        $this->view->blockIndex = $blockIndex;
        $this->view->blockId = $blockId;

        $this->_helper->viewRenderer->setRender('audio-preview');
    }

    public function getBlockAction()
    {
        // disable the view and the layout
        $this->view->layout()->disableLayout();
        $this->_helper->viewRenderer->setNoRender(true);

        $blockId = $this->_getParam('blockId');

        if (!isset($blockId)) {
            return;
        }

        $bl = new Application_Model_Block($blockId);
        $result = [];
        foreach ($bl->getContents(true) as $ele) {
            $result[] = $this->createElementMap($ele);
        }
        $this->_helper->json($result);
    }

    /**
     *Function will load and return the contents of the requested playlist.
     */
    public function getPlaylistAction()
    {
        // disable the view and the layout
        $this->view->layout()->disableLayout();
        $this->_helper->viewRenderer->setNoRender(true);

        $playlistID = $this->_getParam('playlistID');

        if (!isset($playlistID)) {
            return;
        }

        $pl = new Application_Model_Playlist($playlistID);
        $result = [];

        foreach ($pl->getContents(true) as $ele) {
            if ($ele['type'] == 2) {
                // if element is a block expand and add
                $bl = new Application_Model_Block($ele['item_id']);
                if ($bl->isStatic()) {
                    foreach ($bl->getContents(true) as $track) {
                        $result[] = $this->createElementMap($track);
                    }
                }
            } else {
                $result[] = $this->createElementMap($ele);
            }
        }
        $this->_helper->json($result);
    }

    private function createElementMap($track)
    {
        $baseUrl = Config::getBasePath();

        $elementMap = [
            'element_title' => isset($track['track_title']) ? $track['track_title'] : '',
            'element_artist' => isset($track['artist_name']) ? $track['artist_name'] : '',
            'element_id' => isset($track['id']) ? $track['id'] : '',
            'element_position' => isset($track['position']) ? $track['position'] : '',
            'mime' => isset($track['mime']) ? $track['mime'] : '',
        ];

        /* If the track type is static we know it must be
         * a track because static blocks can only contain
         * tracks
         */
        if ($track['type'] == 'static') {
            $track['type'] = 0;
        }
        $elementMap['type'] = $track['type'];

        if ($track['type'] == 0) {
            $mime = trim(strtolower($track['mime']));

            try {
                $elementMap['element_' . FileDataHelper::getAudioMimeTypeArray()[$mime]] = $track['item_id'];
            } catch (Exception $e) {
                throw new Exception("Unknown file type: {$mime}");
            }

            $elementMap['uri'] = $baseUrl . 'api/get-media/file/' . $track['item_id'];
        } else {
            $elementMap['uri'] = $track['path'];
        }

        return $elementMap;
    }

    /**
     * Simply sets up the view to play the required show track.
     *  Gets the parameters from the request and sets them to the view.
     */
    public function showPreviewAction()
    {
        $CC_CONFIG = Config::getConfig();

        $showID = $this->_getParam('showID');
        $showIndex = $this->_getParam('showIndex');

        $baseUrl = Config::getBasePath();

        $this->view->headScript()->appendFile(Assets::url('js/airtime/audiopreview/preview_jplayer.js'), 'text/javascript');
        $this->view->headScript()->appendFile(Assets::url('js/jplayer/jplayer.playlist.min.js'), 'text/javascript');
        $this->view->headLink()->appendStylesheet(Assets::url('js/jplayer/skin/jplayer.airtime.audio.preview.css'));
        $this->_helper->layout->setLayout('audioPlayer');

        $logo = Application_Model_Preference::GetStationLogo();
        if ($logo) {
            $this->view->logo = "data:image/png;base64,{$logo}";
        } else {
            $this->view->logo = $baseUrl . 'css/images/airtime_logo_jp.png';
        }

        $this->view->showID = $showID;
        $this->view->showIndex = $showIndex;

        $this->_helper->viewRenderer->setRender('audio-preview');
    }

    /**
     *Function will load and return the contents of the requested show.
     */
    public function getShowAction()
    {
        $baseUrl = Config::getBasePath();
        // disable the view and the layout
        $this->view->layout()->disableLayout();
        $this->_helper->viewRenderer->setNoRender(true);

        $showID = $this->_getParam('showID');

        if (!isset($showID)) {
            return;
        }

        $showInstance = new Application_Model_ShowInstance($showID);
        $result = [];
        $position = 0;
        foreach ($showInstance->getShowListContent() as $track) {
            $elementMap = [
                'element_title' => isset($track['track_title']) ? $track['track_title'] : '',
                'element_artist' => isset($track['creator']) ? $track['creator'] : '',
                'element_position' => $position,
                'element_id' => ++$position,
                'mime' => isset($track['mime']) ? $track['mime'] : '',
            ];

            $elementMap['type'] = $track['type'];
            if ($track['type'] == 0) {
                $mime = trim(strtolower($track['mime']));

                try {
                    $elementMap['element_' . FileDataHelper::getAudioMimeTypeArray()[$mime]] = $track['item_id'];
                } catch (Exception $e) {
                    throw new Exception("Unknown file type: {$mime}");
                }

                $elementMap['uri'] = $baseUrl . 'api/get-media/file/' . $track['item_id'];
            } else {
                $elementMap['uri'] = $track['filepath'];
            }
            $result[] = $elementMap;
        }

        $this->_helper->json($result);
    }
}