## Websocket
// Ouvrir channel websocket sur port 8500 --> DONE
function startWebsocket(var integer port) -> Websocket:
	var Websocket websocket = start Websocket at port [port]
	return websocket

## Entités
MATCHS -> MatchBean, MatchRepository
MatchBean:
	- id:Long
	- player1:PlayerBean
	- player2:PlayerBean
	- referee:RefereeBean
	- score1:Int (score du player1)
	- score2:Int (score du player2)
	- date:String (date du match)
	- state:String (état du match : terminé, en cours, pas commencé)

REFEREES (arbitres) -> RefereeBean, RefereeRepository
RefereeBean:
	- id:Long
	- name:Long (nom)
	- firstName:String (prénom)

PLAYERS -> PlayerBean, PlayerRepository
PlayerBean:
	- id:Long
	- name:String (nom)
	- firstName:String (prénom)
	
## Services
MatchService --> DONE:
	// Obtenir tous les matchs (public) --> DONE
	function getAll() -> array<MatchBean> :
		return MatchRepository.getAll()
		
	// Obtenir un match par id (public) --> DONE
	function getById(var long id) -> MatchBean :
		return MatchRepository.findById(id)
		
	// Obtenir un ou plusieurs match(s) par joueurs (id) (public) --> DONE
	function getByPlayers(var long player1ID, var long player2ID) -> array<MatchBean> {
		return MatchRepository.getAll().filterBy(player1ID or player2ID)
	}
		
	// Ajouter un match (admin) --> DONE
	function createMatch(var MatchBean newMatch) -> MatchBean :
		MatchRepository.add(newMatch)
		return newMatch
	
	// Modifier un match (admin) --> DONE
	function updateMatch(var long id, var Date date, var long refereeID, var long player1ID, var long player2ID, var integer scorePlayer1, var integer scorePlayer2, var Date date, var string matchState) -> integr (success or not):
		// Vérifier si le match existe à l'id renseigné
		if MatchRepository.getById(id) doesn't exist {
			return FAILED
		}
	
		// Créer nouveau MatchBean à l'id renseigné
		var MatchBean newMatch = new MatchBean(id, player1ID, player2ID, refereeID, score1, score2, date, state)
		
		// Supprimer le MatchBean à l'id en paramètre
		MatchRepository.deleteById(id)
		
		// Insérer le nouveau MatchBean à l'id en paramètre
		MatchRepository.add(newMatch)
		
		return SUCCESS

	
	// Supprimer un match (admin) --> DONE
	function deleteMatch(var long id) -> integer (success or failure) :
		try:
			MatchRepository.deleteById(id)
		catch error:
			return FAILED
			
		return SUCCESS

RefereeService --> DONE:
	// Obtenir tous les arbitres (public) --> DONE
	function getAll() -> array<RefereeBean> :
		return RefereeRepository.getAll()
		
	// Obtenir un arbitre par id (public) --> DONE
	function getById(var long id) -> RefereeBean :
		return RefereeRepository.findById(id)
		
	// Obtenir un ou plusieurs arbitre(s) par nom (public) --> DONE
	function getByName(var string name) -> array<RefereeBean> :		
		return RefereeRepository.getAll().filterBy(name)
		
	// Obtenir un ou plusieurs arbitre(s) par prénom (public) 
	function getByFirstName(var string firstName) -> array<RefereeBean> :
		return RefereeRepository.getAll().filterBy(firstName)
		
	// Ajouter un arbitre (admin) --> DONE
	function createReferee(var RefereeBean newReferee) -> RefereeBean:
		RefereeRepository.add(newReferee)
		return newReferee
		
	// Modifier un arbitre (admin) --> DONE
	function updateReferee(var long id, var string name, var string firstName) -> integer (success or not):
		
		// Vérifier si l'arbitre existe à l'id renseigné
		if RefereeRepository.getById(id) doesn't exist {
			return FAILED
		}
	
		// Créer nouveau RefereeBean à l'id renseigné
		var RefereeBean newReferee = new RefereeBean(id, name, firstName)
		
		// Supprimer le RefereeBean à l'id en paramètre
		RefereeRepository.deleteById(id)
		
		// Insérer le nouveau RefereeBean à l'id en paramètre
		RefereeRepository.add(newReferee)
		
		return SUCCESS
		
		
	// Supprimer un arbitre (admin) --> DONE
	function delete(var long id) -> integer (success or failure) :
		try:
			RefereeRepository.deleteById(id)
		catch error:
			return FAILED
			
		return SUCCESS

PlayerService --> DONE:
	// Obtenir tous les joueurs (public) --> DONE
	function getAll() -> array<PlayerBean> :
		return PlayerRepository.getAll()
		
	// Obtenir un joueur par id (public) --> DONE
	function getById(var long id) -> PlayerBean :
		return PlayerRepository.findById(id)
		
	// Obtenir un ou plusieurs joueur(s) par nom (public) --> DONE
	function getByName(var string name) -> array<PlayerBean> :
		return PlayerRepository.getAll().filterBy(name)
		
	// Obtenir un ou plusieurs joueur(s) par prénom (public) --> DONE
	function getByFirstName(var string firstName) -> array<PlayerBean> :
		return PlayerRepository.getAll().filterBy(firstName)
		
	// Ajouter un joueur (admin) --> DONE
	function add(var PlayerBean newPlayer) -> PlayerBean:
		PlayerRepository.add(newPlayer)
		return newPlayer
		
	// Modifier un joueur (admin) --> DONE
	function update(var long id, var string name, var string firstName) -> PlayerBean :
		// Créer nouveau PlayerBean
		var PlayerBean newPlayer = new PlayerBean(id, name, firstName)
		
		// Supprimer le PlayerBean à l'id en paramètre
		deleteById(id)
		
		// Insérer le nouveau PlayerBean à l'id en paramètre
		PlayerRepository.add(newPlayer)
		
		return newPlayer

	// Supprimer un joueur (admin) --> DONE
	function delete(var long id) -> integer (success or failure) :
		try:
			PlayerRepository.deleteById(id)
		catch error:
			return FAILED
		
		return SUCCESS
	
## RestControllers
MatchRestController --> TODO:
	// Lister tous les matchs --> DONE
	function getAll() -> array<MatchBean> :
		return MatchService.getAll()
		
	// Lister tous les matchs à partir d'une certaine date
	function getAllFromDate(var Date dateToFilter) -> array<MatchBean> : 
		return MatchService.getAll().filter(date == dateToFilter)
		
	// Lister les matchs en cours (état : en cours)
	function getAllActive() -> array<MatchBean> : 
		return MatchService.getAll().filter(state == "ONGOING")
		
	// Lister les matchs terminés (état : terminé)
	function getAllOver() -> array<MatchBean> :
		return MatchService.getAll().filter(state == "FINISHED")
		
	// Lister les matchs non commencés (état : non commencé)
	function getAllNotStarted() -> array<MatchBean> : 
		// MatchService : 
		return MatchService.getAll().filter(state == "NOT STARTED")
		
	// Afficher un match par id
	function get(var long id) -> MatchBean :
		return MatchService.get(id)
		
	// Mettre à jour le score1 d'un match récupéré par id --> TODO
	function updateScore1Of(var long id, var integer newScore) -> integer (success or failure) :
		return MatchService.update(
		
	// Mettre à jour le score2 d'un match récupéré par id --> TODO
	function updateScore2Of(var long id, var integer newScore) -> integer (success or failure) :
		return MatchService.update(
		
	// Ajouter un match (créer nouveau MatchBean dans MatchRepository)
	function add(var MatchBean newMatch) -> integer (success or failure):
		return MatchService.add(newMatch)
		
	// Supprimer un match (supprimer élément de MatchRepository en récupérant l'id)
	function deleteById(var long id) -> integer (success or failure) : 
		return MatchService.deleteById(id)

RefereeRestController --> DONE:
	// Lister tous les arbitres
	function getAll() -> array<RefereeBean> : 
		return RefereeService.getAll()
		
	// Afficher un arbitre par id
	function get(var long id) -> RefereeBean : 
		return RefereeService.get(id)
		
	// Afficher un arbitre par nom
	function get(var string name) -> RefereeBean:
		return RefereeService.get(name)
		
	// Ajouter un arbitre (créer nouveau RefereeBean dans RefereeRepository)
	function add(var RefereeBean newReferee) -> integer (success or failure) :
		return RefereeService.add(newReferee)
		
	// Supprimer un arbitre (supprimer élément de RefereeRepository en récupérant l'id)
	function deleteById(var long id) -> integer (success or failure) :
		return RefereeService.deleteById(id)

PlayerRestController --> DONE:
	// Lister tous les joueurs
	function getAll() -> array<PlayerBean> : 
		return PlayerService.getAll()
		
	// Afficher un joueur par id
	function get(var long id) -> PlayerBean : 
		return PlayerService.get(id)
		
	// Afficher un joueur par nom
	function get(var string name) -> PlayerBean :
		return PlayerService.get(name) 
		
	// Ajouter un joueur (créer nouveau PlayerBean dans PlayerRepository)
	function add(var PlayerBean newPlayer) -> integer (success or failure) : 
		return PlayerService.add(newPlayer)
		
	// Supprimer un joueur (supprimer élément de PlayerRepository en récupérant l'id)
	function deleteById(var long id) -> integer (success or failure) : 
		return PlayerService.deleteById(id)

## Pages
Page des matchs (publique) : 
	à définir (partie front sur Angular ?)

Page de connexion à l'administration (publique) :
	formulaire :
	- nom d'utilisateur
	- mot de passe

Page d'administration (privée) :
	à définir (partie front sur Angular ?)