package info.bukova.isspst;

import info.bukova.isspst.reporting.Report;
import info.bukova.isspst.services.AbstractService;
import info.bukova.isspst.services.ModuleNotActiveException;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Pepa Rokos
 *
 * Třída reprezentuje informace o modulu (agendě).
 *  
 */
public class Module {
	
	private String id;
	private String name;
	private Class<?> serviceClass;
	private List<Report> reports;
	private boolean defaultPermissions;
	private boolean active;
	
	public Class<?> getServiceClass() {
		return serviceClass;
	}

	public void setServiceClass(Class<?> serviceClass) {
		this.serviceClass = serviceClass;
	}

	/**
	 * 
	 * @param id identifikátor modulu
	 * @param name jméno zobrazované v aplikaci
	 * @param serviceClass servisní třída
	 */
	public Module(String id, String name, Class<?> serviceClass) {
		this.id = id;
		this.name = name;
		this.serviceClass = serviceClass;
		reports = new ArrayList<Report>();
		defaultPermissions = true;
		active = true;
	}
	
	/**
	 * @param id identifikátor modulu
	 * @param name jméno zobrazované v aplikaci
	 * @param serviceClass servisní třída
	 * @param active příznak, jestli je modul aktivní
	 */
	public Module(String id, String name, Class<?> serviceClass, boolean active) {
		this(id, name, serviceClass);
		this.active = active;
	}
	
	/**
	 * @param id identifikátor modulu
	 * @param name jméno zobrazované v aplikaci
	 * @param serviceClass servisní třída
	 * @param active příznak, jestli je modul aktivní.
	 * @param defaultPermissions příznak určující jestli modul kontroluje výchozí práva (čtení, zápis, modifikace, mazání)
	 */
	public Module(String id, String name, Class<?> serviceClass, boolean active, boolean defaultPermissions) {
		this(id, name, serviceClass, active);
		this.defaultPermissions = defaultPermissions;
	}
	
	public String getId() {
		return id;
	}
	
	public void setId(String id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public List<Report> getReports() {
		return reports;
	}
	
	public void addReport(Report report) {
		this.reports.add(report);
	}

	/**
	 * Pokud je true, modul kontroluje výchozí práva (čtení, zápis, modifikace, mazání). Má vliv
	 * na generování formulářů v nastavení práv.
	 * 
	 * @return výchozí práva. Default true
	 */
	public boolean isDefaultPermissions() {
		return defaultPermissions;
	}

	public void setDefaultPermissions(boolean defaultPermissions) {
		this.defaultPermissions = defaultPermissions;
	}

	/**
	 * Určuje, zda je modul aktivní. Neaktivní moduly nejsou viditelné v UI. Při pokusu o přístup přímo přes URL
	 * se generuje výjimka {@link ModuleNotActiveException}. Pokud servisní třída modulu nedědí z {@link AbstractService},
	 * musí se implementovat kontrola aktivity do příslušné třídy.
	 * 
	 * @return aktivita. Default true
	 */
	public boolean isActive() {
		return active;
	}

	public void setActive(boolean active) {
		this.active = active;
	}

}
