class 'ExtraVideoBase' (ExtraCollectionPageBase)

function ExtraVideoBase:__init(extraScreen, order)
	ExtraCollectionPageBase.__init(self, extraScreen, 'videoPage', order)

	self.previewFileFormat	= 'Data/ExtraContent/Textures/Screens/Extra/Video/preview_%s.jpg'
	self.previewNameFormat	= 'video_%s'

	-- Первый %s - каталог ExtraContent
	-- Второй %s - каталог ресурсов конкретной сцены
	-- Третий %s - имя файла
	self.videosPathFormat	= 'Data/%s/Video/Scenes/%s/%s.webm'	-- шаблон для генерации пути к видео.
	self.soundsPathFormat	= 'Data/%s/Sounds/Scenes/%s/%s.ogg'	-- шаблон для генерации пути к звукам.
	self.extraContentFolder = 'ExtraContent'					-- название каталога, хранящего весь "экстра контент".
	self.lockPreviewName	= 'video_lock'

	self.videos = {}
end
-------------------------------------------------------------------------------

--[[
 * Иницаилизация спрайтов предпросмотра. Сначало вызывает метот инициализации 
 * таблицы видео-роликов. На ее основании определяет количество необходимых "превьюшек".
 * Затем создает спрацты предпросмотра только для тех видео, которые помечены как доступны. 
--]]
function ExtraVideoBase:initPreviews()
	self:initVideos()
	self.count = #self.videos

	self:getCurrentPreview():setOpacity(1)
end
-------------------------------------------------------------------------------

function ExtraVideoBase:onPreviewHided(index)
	local preview = self.previews[index]

	if (index ~= self.index) and preview and preview:getName() ~= self.lockPreviewName then
		preview:destroy()
		self.previews[index] = nil
	end
end
-------------------------------------------------------------------------------

function ExtraVideoBase:getCurrentPreview()
	if not self.previews[self.index] then
		local info = self.videos[ self.index ]
		self.previews[self.index] = info.bEnable and self:createPreview( self.index )
												  or self:getEntityNamed( self.lockPreviewName )
	end

	return self.previews[self.index]
end
-------------------------------------------------------------------------------

--[[
 * Переопределение метода получения имени спрайта предпросмотра. В качестве уникальной
 * части имени берется имя видео (по-умолчанию брался индек).
 * @param	index	Индекс объекта предпросмотра.
--]]
function ExtraVideoBase:getPreviewName(index)
	local id = self.videos[index].name
	return string.format(self.previewNameFormat, id)
end
-------------------------------------------------------------------------------

--[[
 * Переопределение метода получения полного пути к файлу спрайта предпросмотра.
 * В качестве уникальной части имени берется имя видео (по-умолчанию брался индек).
 * @param	index	Индекс объекта предпросмотра.
--]]
function ExtraVideoBase:getPreviewFilePath(index)
	local id = self.videos[index].name
	return string.format(self.previewFileFormat, id)
end
-------------------------------------------------------------------------------

--[[
 * Инициализация таблицы видео-роликов. Этот метод необходимо переопределить в классе
 * потомке и добавить видео-ролики с помощью метода addVideo.
--]]
function ExtraVideoBase:initVideos()
	--self:addVideo('videoName', [{] 'soundName' [, 'soundName2'}], levelName,  true)
end
-------------------------------------------------------------------------------

--[[
 * Метод добавляет в таблицу видео-роликов информацию про видео.
 * При добавлении генерируются пути к ресурсам (видео и аудио файлам)
 * и определяется доступно ли видео к просмотру.
 * @param	fullVideoName	Полное имя видео файла.
 * @param	fullSoundName	Полное имя аудио файла.
 * @param	bEnable			Определяет, доступно ли видео к просмотру. Если не задан,
 *							то доступность определяется по тому, посещена ли сцена,
 *							хранящая даное видео.
 * @param	subtitles		Таблица субтитров. Должна состоять из подмножества
 *							тиблиц, хранящих 3 значения: текстовый ключ, начала
 *							отображения фразы и длительность отображения фразы.
--]]
function ExtraVideoBase:addVideo(fullVideoName, fullSoundName, bEnable, subtitles)
	local info = {}

	if type(bEnable) == 'function' then
		bEnable = bEnable()
	end

	info.name		= self:extractName(fullVideoName)
	info.videoPath	= fullVideoName
	info.soundPath	= fullSoundName
	info.bEnable	= bEnable
	info.subtitles	= subtitles

	table.insert(self.videos, info)
end
-------------------------------------------------------------------------------

--[[
 * Определяет, является ли переданая строка полным путем к файлу.
 * @param	path	Проверяемая строка.
--]]
function ExtraVideoBase:isFullPath(path)
	return (string.find(string.lower(path), 'Data/') == 1)
end
-------------------------------------------------------------------------------

--[[
 * Извлекает имя файла из полного пути.
--]]
function ExtraVideoBase:extractName(path)
	if self:isFullPath(path) then
		return ExtractFileName(path)
	end

	return path
end
-------------------------------------------------------------------------------

--[[
 * Обработчик нажатия на кнопку "Play" в "скрине", которому принадлежит ExtraVideoBase.
--]]
function ExtraVideoBase:play()
	local info = self.videos[self.index]

	if info.bEnable then
		local musicPage = self.screen:getPage('music').entity

		if musicPage:isPlaying() then
			musicPage:stop()
		end

		self:onVideoStarted()
		createExtraVideoPlayerScreen(info, bind(self.onVideoEnded, self))
	else
		local msg = StringManager:getString('CE_CONTENT_NOT_AVAILABLE')
		createOkScreen(msg, nil, false)
	end
end
-------------------------------------------------------------------------------

--[[
 * Метод вызывается перез созданием скрина воспроизведения видео. В даном методе
 * должны выполнятся уникальные для конкретного проекта части кода.
 * Например: остановка фоновой музыки. 
--]]
function ExtraVideoBase:onVideoStarted()
	-- local mainMusic = getGameRoot():getEntityNamed(NAME_MAIN_SOUND)
	-- if mainMusic then
	-- 	mainMusic:pause()
	-- end
end
-------------------------------------------------------------------------------

--[[
 * Метод вызывается сразу после окончания воспроизведения видео. В даном методе
 * должны выполнятся уникальные для конкретного проекта части кода.
 * Например: возобновление воспроизведения фоновой музыки. 
--]]
function ExtraVideoBase:onVideoEnded()
	-- local mainMusic = getGameRoot():getEntityNamed(NAME_MAIN_SOUND)
	-- if mainMusic then
	-- 	mainMusic:play()
	-- end
end
-------------------------------------------------------------------------------