package foundation.user;

import foundation.capacity.ActorTarget;
import foundation.capacity.sight.Sight;
import foundation.json.IJSONProvider;
import foundation.json.IJSONWriter;
import foundation.org.Employee;
import foundation.org.Position;
import foundation.token.IOnlineUser;
import foundation.token.IUser;
import foundation.variant.provider.DataEvent;

public class OnlineUser extends IOnlineUser implements IJSONProvider {

	private String onlineCode;
	private User user;
	
	public OnlineUser(String onlineCode, IUser user) {  
		this.onlineCode = onlineCode;
		this.user = (User)user;
	}
	
	public static OnlineUser getInstance() {
		IOnlineUser one = localInstance.get();
		
		if (one == null) {
			return null;
		}
		
		OnlineUser onlineUser = (OnlineUser)one;
		return onlineUser;
	}

	public void collectActors() throws Exception {
		user.loadHierarchyAndCapacitys();
	}

	public ActorTarget getCurrentActor() throws Exception {
		return user.getCurrentActor(onlineCode);
	}
	
	public ActorTarget changeCurrentCapacity(String actorId) throws Exception {
		return user.changeCurrentActor(onlineCode, actorId);
	}

	public Sight getCurrentSight() throws Exception {
		return user.getCurrentSight(onlineCode);
	}

	public String getPassword() {
		return user.getPassword();
	}

	public void chagnePassword(String newPass) throws Exception {
		user.chagnePassword(newPass);
	}
	
	public String getOnlineCode() {
		return onlineCode;
	}

	public User getUser() {
		return user;
	}
	
	@Override
	public boolean isAdmin() {
		return user.isAdmin();
	}
	
	@Override
	public String getId() {
		return user.getId();
	}
	
	@Override
	public String getCode() {
		return user.getCode();
	}
	
	@Override
	public String getName() {
		return user.getName();
	}

	@Override
	public String getOrgId() {
		return user.getOrgId();
	}
	
	@Override
	public String getPositionId() throws Exception {
		Position position = user.getPosition(onlineCode);
		
		if (position == null) {
			return null;
		}
		
		return position.getId();
	}
	
	@Override
	public String getActorId() throws Exception {
		ActorTarget actor = user.getCurrentActor(onlineCode);
		
		if (actor == null) {
			return null;
		}
		
		return actor.getActorId();
	}
	
	@Override
	public String getPositionField() throws Exception {
		Position position = user.getPosition(onlineCode);
		
		if (position == null) {
			return null;
		}
		
		return position.getLevelField();
	}

	public Position getCurrentPosition() {
		return user.getCurrentPosition();
	}
	
	@Override
	public String getAccountId() throws Exception {
		ActorTarget actorTarget = user.getCurrentActor(onlineCode);
		
		if (actorTarget == null) {
			return null;
		}
		
		return actorTarget.getTargetId();
	}

	@Override
	public String getCompanyId() throws Exception {
		ActorTarget actorTarget = user.getCurrentActor(onlineCode);
		
		if (actorTarget == null) {
			return null;
		}
		
		return actorTarget.getCompanyId();
	}

	@Override
	public String getBUId() throws Exception {
		ActorTarget actorTarget = user.getCurrentActor(onlineCode);
		
		if (actorTarget == null) {
			return null;
		}
		
		return actorTarget.getBuId();
	}
	
	@Override
	public boolean isOrgFrozen() {
		boolean result = user.isOrgFrozen();
		return result;
	}

	@Override
	public boolean isAnymous() {
		return user.isAnymous();
	}

	@Override
	public boolean isLimitActive() {
		return user.isLimitActive();
	}
	
	@Override
	public String getEmployeeId() {
		Employee employee = user.getCurrentEmployee();
		if (employee == null) {
			return null;
		}
		return employee.getId();
	}

	public Employee getEmployee() {
		Employee employee = user.getCurrentEmployee();
		
		if (employee == null) {
			return null;
		}
		return employee;
	}
	
	@Override
	public String getEmployeeName() {
		Employee employee = user.getCurrentEmployee();
		
		if (employee == null) {
			return null;
		}
		return employee.getName();
	}

	@Override
	public Object getVariantValue(DataEvent dataEvent, String variantName) {
		return user.getVariantValue(dataEvent, variantName);
	}

	@Override
	public void writeJSON(IJSONWriter writer) {
		writer.beginObject();
		
		//1. user write
		user.writeJSONBody(writer);
		
		//2. online user write
		writeJSONBody(writer);
		
		writer.endObject();
	}

	private void writeJSONBody(IJSONWriter writer) {
		try {
			ActorTarget actor = user.getCurrentActor(onlineCode);
			if (actor != null) {
				writer.beginObject("currentActor");
				actor.writeJSONBody(writer);
				writer.endObject();
			}
			else {
				writer.writeNull("currentCapacity");
			}
			
			Employee employee = user.getCurrentEmployee();
			if (employee != null) {
				writer.beginObject("employee");
				employee.writeJSONBody(writer);
				writer.endObject();
			}
			else {
				writer.writeNull("employee");
			}
			
			
			
			writer.write("position_level_field", getPositionField());
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}