<?php
/**
 * Connected
 *
 * @license		GPL
 * @package		Connected
 * @link		https://gitlab.liris.cnrs.fr/mloiseau/mw_connected
 *
 **/
class ConnectedHooks {
	// Register any render callbacks with the parser
	public static function onParserFirstCallInit( Parser $parser ) {
		// Create a function hook associating the "example" magic word with renderExample()
		$parser->setFunctionHook( 'iflogged', [ self::class, 'ifConnectedRender' ] );
		// TODO: Le getuser ne marche pas car $parser est null ne marche pas ici à voir comment on fait
		//cf. https://github.com/wikimedia/mediawiki-extensions-WikiTextLoggedInOut/blob/d764bd3972ed6b84a4af3ed423a3a5fd9b82c493/includes/WikiTextLoggedInOut.php#L39
		if ( method_exists( $parser, 'getUserIdentity' ) ) {
			// MW 1.36+
			$res = $parser->getUserIdentity()->isRegistered();
		} else {
			if (method_exists( $parser, 'getUser' )){
				$res = $parser->getUser()->isRegistered();
			}
			else{
				$res = '';
			}
		}
		$parser->getOptions()->setOption( 'connected', string($res) );
	}

	public static function onParserOptionsRegister( &$defaults, &$inCacheKey, &$lazyOptions ) {
		$inCacheKey['connected'] = true;
		$defaults['connected'] = '';
		return true;
	}

	// Render the output of {{#ifloggedin:}} i.e. iflogged function.
	public static function ifConnectedRender( Parser $parser, $ifLoggedIn = '', $ifNot = '') {
		// The input parameters are wikitext with templates expanded.
		// The output should be wikitext too.
		if ( $parser->getOptions()->getOption('connected') == string(true)) {
			$output = $ifLoggedIn;
		}
		else{
			$output = $ifNot;
		}
		return [ $output, 'noparse' => false ];
	}

	//calcul des variables
	public static function wfConnectedAssignValue( Parser $parser, &$cache, $magicWordId, &$ret, $frame) {
		$result = false;
		switch($magicWordId){
			case 'connected' :
				if ( $parser->getOptions()->getOption('connected') == string(false)) {
					$ret = 0;
					$result = true;
				}
				else{
					$ret = 1;
					$result = true;
				}
				break;
			case 'u_name':
				if ( $parser->getOptions()->getOption('connected') == string(false)) {
					$ret = $wgUser->getName();
					$result = true;
				}
				else{
					$ret = $wgUser->getName();
					$result = true;
				}
				break;
		}
		return $result;
	}

	//mettre à jour la liste de variables
	public static function connectedDeclareVarIds( &$customVariableIds ) {
		// $customVariableIds is where MediaWiki wants to store its list of custom
		// variable IDs. We oblige by adding ours:
		$customVariableIds[] = 'connected';
		$customVariableIds[] = 'u_name';
	}

	#Cacher la barre de menu quand on n'est pas logué et charger une css supplémentaire
//https://www.mediawiki.org/wiki/Manual:Interface/Sidebar#Change_sidebar_content_when_logged_in_(PHP)
//https://www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
	public static function lfHideSidebar( $skin, &$bar ) {
		// Hide sidebar for anonymous users
		if ( $parser->getOptions()->getOption('connected') == string(false)) {
			$bar = array(
				'navigation' => array(
					array(
						'text'   => wfMessage( 'login' ) -> text(),
						'href'   => SpecialPage::getTitleFor( 'Login' )->getLocalURL(),
						'id'     => 'n-login',
						'active' => ''
					)
				)
			);
		}
		return true;
	}

	#Ajouter une feuille de style quand pas connecté
	public static function add_NotLoggedIncss( OutputPage $out, Skin $skin ) {
		if ( $parser->getOptions()->getOption('connected') == string(false)) {
			$out->addStyle('/w/index.php?title=MediaWiki:NotLoggedIn.css&action=raw&ctype=text/css');
			$out->addMeta( "logged", "no" );
		}
		else{
			$out->addStyle('/w/index.php?title=MediaWiki:LoggedIn.css&action=raw&ctype=text/css');
			$out->addMeta( "logged", "yes" );
		}
	}
}