<?php

class CATC extends Main
{
	/**
	 * Auth Object
	 * @var Auth
	 */
	private $oAuth;	
	
	public function __construct($oClassManagement, $sProcessPage)
	{
		$asClasses = array(
			array('name'=>'auth', 'project'=>true),
			array('name'=>'course', 'project'=>true),
			array('name'=>'note', 'project'=>true),
			array('name'=>'doc', 'project'=>true),
			array('name'=>'definition', 'project'=>true)
		);
		parent::__construct($oClassManagement, $sProcessPage, $asClasses);
		
		//if($this->oDb->sDbState == Db::DB_PEACHY) $this->oAuth = new Auth($this->oDb, Settings::API_KEY);
		$this->oAuth = new Auth($this->oDb, Settings::API_KEY);
	}
	
	protected function install()
	{
		//Install DB
		$this->oDb->install();
		$this->oDb->loadFile('db_build.sql');
	}
	
	protected function getSqlOptions()
	{
		return array
		(
			'tables' 			=>	array
			(
				Auth::USER_TABLE		=> array(Db::getText(Auth::USER_TABLE), 'nickname', 'pass', 'cookie'),
				Course::WS_TABLE		=> array('dates'),
				Course::COURSE_TABLE	=> array(Db::getId('workshops'), 'description', 'timeslot'),
				Note::NOTE_TABLE		=> array(Db::getId(Auth::USER_TABLE), Db::getId(Course::COURSE_TABLE), 'notes'),
				Definition::DEF_TABLE	=> array(Db::getId(Auth::USER_TABLE), 'title', 'description'),
				Doc::DOC_TABLE			=> array(Db::getId(Auth::USER_TABLE), Db::getId(Course::COURSE_TABLE), 'type', 'filename'),
				'todos'					=> array(Db::getId(Auth::USER_TABLE), Db::getId(Course::COURSE_TABLE), 'description')
			),
			'types' 			=>	array
			(
				Db::getText(Auth::USER_TABLE)	=> "VARCHAR(32) NOT NULL",
				'nickname'						=> "VARCHAR(60) NOT NULL",
				'pass'							=> "VARCHAR(256) NOT NULL",
				'cookie'						=> "VARCHAR(255)",
				'dates'							=> "VARCHAR(50)",
				'title'							=> "VARCHAR(50)",
				'description'					=> "VARCHAR(200)",
				'timeslot'						=> "ENUM('SAT-M', 'SAT-A', 'SUN-M', 'SUN-A')",
				'notes'							=> "LONGTEXT",
				'type'							=> "VARCHAR(10)",
				'filename'						=> "VARCHAR(200)"
			),
			'constraints'		=>	array
			(
				Doc::DOC_TABLE			=> "UNIQUE KEY `uni_file` (`filename`)",
				Definition::DEF_TABLE	=> "UNIQUE KEY `uni_def_title` (`title`)"
			)
		);
	}
	
	private function getVars() {
		return array(
			'id'		=> $this->oAuth->getUserId(),
			'log_in'	=> $this->isLoggedIn()
		);
	}
	
	public function getAppMainPage()
	{
		return self::getMainPage(
			array(
				'consts'	=> array(
					'token_sep'	=> Auth::TOKEN_SEP,
					'error'		=> self::ERROR,
					'success'	=> self::SUCCESS,
					'context'	=> $this->asContext,
					'cookie'	=> Auth::USER_COOKIE_PASS,
					'workshops'	=> (new Course($this->oDb))->getWorkshops(),
					'courses'	=> (new Course($this->oDb))->getCourses()
				),
				'vars'		=> $this->getVars()
			),
			'index',
			array(
				'filepath_css'		=> self::addTimestampToFilePath('style/catc.css'),
				'filepath_js_catc'	=> self::addTimestampToFilePath('scripts/catc.js')
			)
		);
	}
	
	/* Authorizations handling */
	
	public function register($sToken, $sNickname)
	{
		$asResult = $this->oAuth->register($sToken, $sNickname);
		
		if($asResult['success']) return $this->logMeIn($sToken);
		else return self::getJsonResult($asResult['success'], $asResult['desc']);
	}
	
	public function isLoggedIn()
	{
		return $this->oAuth->isLoggedIn();
	}
	
	public function logMeIn($sToken)
	{
		$asLogResult = $this->oAuth->logMeIn($sToken);
		return self::getJsonResult($asLogResult['success'], $asLogResult['desc'], $this->getVars());
	}
	
	public function checkApiKey($sApiKey)
	{
		return $this->oAuth->checkApiKey($sApiKey);
	}
	
	/* Notes*/
	
	public function getNote($iCourseId) {
		$oNote = new Note($this->oDb, $this->oAuth->getUserId(), $iCourseId);
		$asNote = $oNote->getNote();
		
		return self::getJsonResult(!empty($asNote), '', $asNote);
	}
	
	public function setNote($iCourseId, $asOps) {
		$oNote = new Note($this->oDb, $this->oAuth->getUserId(), $iCourseId);
		$sError = $oNote->setNote($asOps);
		$bSuccess = ($sError=='');
		
		$asData = ($bSuccess)?array('led_time' => $oNote->getNote()['led_time']):array();
		
		return self::getJsonResult($bSuccess, $sError, $asData);
	}
	
	/* Docs */
	
	public function getDocs($iCourseId) {
		$oDoc = new Doc($this->oDb, $this->oAuth->getUserId(), $iCourseId);
		$asDocList = $oDoc->getList();
		return self::getJsonResult(!empty($asDocList), '', $asDocList);
	}
	
	public function uploadDoc($iCourseId) {
		$this->oClassManagement->incClass('uploader', true);
		$oDoc = new Doc($this->oDb, $this->oAuth->getUserId(), $iCourseId);
		$oUploader = new Uploader($oDoc);
		
		return $oUploader->sBody;
	}
	
	public function deleteDoc($iDocId) {
		$oDoc = new Doc($this->oDb);
		$oDoc->setDocId($iDocId);
		$bResult = $oDoc->delete();
		
		return self::getJsonResult($bResult, '');
	}
	
	/* Defs */
	
	public function getDefs() {
		$oDef = new Definition($this->oDb, $this->oAuth->getUserId());
		return self::getJsonResult(true, '', $oDef->getDefinitions());
	}
	
	public function setDef($iDefId, $sTitle, $sDesc) {
		$bNew = ($iDefId == 0);
		$oDef = new Definition($this->oDb, $this->oAuth->getUserId(), $iDefId);
		$bResult = $oDef->setDefinition($sTitle, $sDesc);
		return self::getJsonResult($bResult, '', array('new_def'=>$bNew, 'def'=>$oDef->getDefinition()));
	}
}