package gov.anl.dm.esafsync.serviceconn;

import java.io.Serializable;
import java.net.HttpCookie;

import javax.swing.JOptionPane;

/**
 * CDB session class, used for keeping all session-related information (session
 * id, username, role, etc.).
 */
public class Session implements Serializable {

	public enum Role {

	    USER("User"),
	    ADMIN("Administrator");

	    private final String type;

	    private Role(String type) {
	        this.type = type;
	    }

	    @Override
	    public String toString() {
	        return type;
	    }

	    public static Role fromString(String type) {
	        Role role = null;
	        switch (type) {
	            case "User":
	                role = USER;
	                break;
	            case "Administrator":
	                role = ADMIN;
	                break;
	        }
	        return role;
	    }
	}

    private static final long serialVersionUID = 1L;

    private String id = null;
    private String username = null;
    private String cookie = null;
    
    private Role role = null;

    public Session() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getCookie() {
        return cookie;
    }

    public void setCookie(String cookie) {
        this.cookie = cookie;
    }

    public String verifyCookie() {
        if (cookie == null) {
        	JOptionPane.showMessageDialog(null, "Valid session has not been established.", "Info",JOptionPane.INFORMATION_MESSAGE);
        } else {
            HttpCookie httpCookie = HttpCookie.parse(cookie).get(0);
            if (httpCookie.hasExpired()) {
            	JOptionPane.showMessageDialog(null, "Session has expired.", "Info",JOptionPane.INFORMATION_MESSAGE);
            }
        }
        return cookie;
    }
    
    public boolean isValid() {
        if (cookie == null) {
        	return false;
        } else {
            HttpCookie httpCookie = HttpCookie.parse(cookie).get(0);
            if (httpCookie.hasExpired()) {
            	return false;
            }
        }
        return true;    	
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

    public boolean isAdminRole() {
        if (role != null) {
            return role.equals(Role.ADMIN);
        }
        return false;
    }

    public boolean isUserRole() {
        if (role != null) {
            return role.equals(Role.USER);
        }
        return false;
    }

    @Override
    public String toString() {
        String result = "{ ";
        String delimiter = "";
        if (username != null) {
            result += "username :" + username;
            delimiter = "; ";
        }
        if (id != null) {
            result += delimiter + "id : " + id;
            delimiter = "; ";
        }
        if (cookie != null) {
            result += delimiter + "cookie : " + cookie;
        }
        result += " }";
        return result;
    }
}