package info.bukova.isspst.security;

import info.bukova.isspst.Constants;
import info.bukova.isspst.Module;
import info.bukova.isspst.data.Permission;
import info.bukova.isspst.data.PermissionType;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.data.User;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.services.Service;
import info.bukova.isspst.services.workgroups.WorkgroupService;

import java.util.List;

import org.springframework.security.core.Authentication;

/**
 * Vyhodnocovač práv vstahujících se ke členství ve středisku nebo komisi.
 * Pokud má uživatel v některém ze středisek/komisí jichž je členem zadané
 * oprávnění, je vyhodnoceno jako true a anotovaná metoda se provede.
 *  
 * @author pepa
 *
 */
public class WorkgroupAwareServiceEvaluator implements Evaluator {

	private WorkgroupService wgService;
	
	public WorkgroupAwareServiceEvaluator(WorkgroupService wgService) {
		this.wgService = wgService;
	}
	
	@Override
	public boolean evaluate(Authentication authentication,
			Object targetDomainObject, String permission) {
		
		List<Workgroup> userWorkgroups;
		
		if (!(authentication.getPrincipal() instanceof User)) {
			return false;
		}
		
		User user = (User)authentication.getPrincipal();
		String moduleId = "";
		
		if (targetDomainObject instanceof Service<?>) {
			Service<?> service = (Service<?>)targetDomainObject;
			Module mod = service.getModule();
			
			if (mod != null) {
				moduleId = mod.getId();
			}
		}
		
		// TODO - v master větvi je na toto pomocná třída
		/*for (Module m : Constants.MODULES) {
			if (m.getServiceClass() != null && m.getServiceClass().isAssignableFrom(targetDomainObject.getClass())) {
				moduleId = m.getId();
				break;
			}
		}*/
		
		Permission appPermission = null;
		for (Permission p : Constants.SPECIAL_PERMISSIONS) {
			if (p.getAuthority().equals(permission) 
					&& p.getModule().equals(moduleId)) {
				appPermission = p;
				break;
			}
		}

		if (appPermission == null) {
			return false;
		}
		
		if (appPermission.getType() == PermissionType.CENTRE) {
			userWorkgroups = wgService.getUserCentres(user);
		} else {
			userWorkgroups = wgService.getUserWorkgroups(user);
		}
		
		for (Workgroup wg : userWorkgroups) {
			List<Role> wgRoles = wgService.getUserWorkgroupRoles(wg, user);
			
			if (wgRoles == null) {
				continue;
			}
			
			for (Role r : wgRoles) {
				for (Permission p : r.getPermissions()) {
					if (p.getAuthority().equals(appPermission.getAuthority())
							&& p.getModule().equals(appPermission.getModule())) {
						return true;
					}
				}
			}
		}
		
		return false;
	}

}
