package com.k_int.ciim.ui.json;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import org.springframework.stereotype.Component;

import com.k_int.ciim.data.hdo.ContextHDO;
import com.k_int.svc.identity.datamodel.AuthenticationDetailsHDO;
import com.k_int.svc.identity.datamodel.RegisteredUserHDO;
import com.k_int.svc.identity.datamodel.RoleHDO;
import com.sun.jersey.api.view.ImplicitProduces;


@XmlRootElement(name="user") 
@ImplicitProduces("application/json;qs=5")
@XmlAccessorType(XmlAccessType.FIELD)
@Component
public class UserJSON
{
	@XmlTransient
	public static final SimpleDateFormat DEFAULT_FORMAT = new SimpleDateFormat("dd/MM/yyyy '<I>'HH:mm'</I>'");
	
	private Long id;
	private String username;
	private String display_name;
	private String email;
	private String active;
	private String last_login;
	private String registration_date;
	private String role;
	private List<PermissionJSON> permissions = new ArrayList<PermissionJSON>();
	
	protected UserJSON(){ ;	}
		
	public UserJSON(AuthenticationDetailsHDO hdo, Map<ContextHDO, List<Integer>> granted_permissions)
	{
		if(hdo != null)
		{
			this.username = hdo.getName();
			
			RegisteredUserHDO reg_user_hdo = hdo.getUser();
			
			if(reg_user_hdo != null)
			{
				this.id = reg_user_hdo.getId();
				this.display_name = reg_user_hdo.getName();
				this.email = reg_user_hdo.getPrimaryEmail();
				this.active = reg_user_hdo.getActive().toString();
				
				if(reg_user_hdo.getRoles() != null && reg_user_hdo.getRoles().isEmpty() == false)
				{
					RoleHDO role_hdo = reg_user_hdo.getRoles().iterator().next();
					this.role = role_hdo.getDescription();
				}
						
				if(reg_user_hdo.getLastLogin() != null)
				{
					this.last_login = DEFAULT_FORMAT.format(reg_user_hdo.getLastLogin());
				}
				if(reg_user_hdo.getDateRegistered() != null)
				{
					this.registration_date = DEFAULT_FORMAT.format(reg_user_hdo.getDateRegistered());
				}
			}
			
			if(granted_permissions != null && granted_permissions.size() > 0)
			{
				Iterator<ContextHDO> iter = granted_permissions.keySet().iterator();
				
				while(iter.hasNext())
				{
					ContextHDO key = iter.next(); 
					
					PermissionJSON permission_json = new PermissionJSON(key);
					
					permission_json.setGranted(new HashSet<Integer>(granted_permissions.get(key)));
					
					permissions.add(permission_json);
				}
			}
		}
	}
	
	public UserJSON(RegisteredUserHDO hdo, String username)
	{
		this.username = username;
		
		if(hdo != null)
		{
			this.id = hdo.getId();
			this.display_name = hdo.getName();
			this.email = hdo.getPrimaryEmail();
			this.active = hdo.getActive().toString();
			
			if(hdo.getLastLogin() != null)
			{
				this.last_login = DEFAULT_FORMAT.format(hdo.getLastLogin());
			}
			if(hdo.getDateRegistered() != null)
			{
				this.registration_date = DEFAULT_FORMAT.format(hdo.getDateRegistered());
			}
		}
	}

	public Long getId() 
	{
		return id;
	}

	public void setId(Long id)
	{
		this.id = id;
	}

	public String getUsername() 
	{
		return username;
	}

	public void setUsername(String username)
	{
		this.username = username;
	}

	public String getDisplayName() 
	{
		return display_name;
	}

	public void setDisplayName(String displayName) 
	{
		display_name = displayName;
	}

	public String getEmail() 
	{
		return email;
	}

	public void setEmail(String email)
	{
		this.email = email;
	}

	public String getActive() 
	{
		return active;
	}

	public void setActive(String active) 
	{
		this.active = active;
	}

	public String getLastLogin() 
	{
		return last_login;
	}

	public void setLastLogin(String lastLogin) 
	{
		last_login = lastLogin;
	}

	public String getRegistrationDate()
	{
		return registration_date;
	}

	public void Registration(String registration_date) 
	{
		this.registration_date = registration_date;
	}

	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}

	public List<PermissionJSON> getPermissions() {
		return permissions;
	}

	public void setPermissions(List<PermissionJSON> permissions) {
		this.permissions = permissions;
	}
}
