/*
 * Facebook Login Servlet - Shiboleth Identity Provider integrator with Facebook
 * Copyright (C) 2012 Poznan Supercomputing and Networking Center - Application
 * Department
 * 
 * contact: adamski@man.poznan.pl
 * 
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details. You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 * 
 * 
 * Poznan Supercomputing and Networking Center - Application Department,
 * ul.Dąbrowskiego 79a, 60-529 Poznań, Poland. (+48 61) 858-20-72
 * http://apps.man.poznan.pl/
 * 
 * This application was developed as a part of the SYNAT project
 * http://www.synat.pl/en
 * 
 * Poznan Supercomputing and Networking Center, hereby disclaims all copyright
 * interest in the Facebook Login Servlet written by Jakub "Erwin" Aftowicz.
 * (erwin37@gmail.com)
 * 
 * Marcin Adamski , 21 MAY 2012 (adamski@man.poznan.pl)
 */
package pl.psnc.synat.idp;


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


public class FBConfig {

	public FBConfig() {
		this.parameters = new ArrayList<Parameter>();
		this.fbParameters = new ArrayList<FbParameter>();
	}

	private String APP_ID;
	private String APP_SECRET;
	private boolean isDatabaseUsed = false;
	private boolean isDatabasePasswordUsed = false;
	private boolean isUserBeingInserted = false;
	private boolean isBlackListUsed = false;
	private boolean isBlackListPasswordUsed = false;
	private boolean isSqlJNDIUsed = false;
	private boolean isBlackListJNDIUsed = false;
	private String SqlDriver;
	private String SqlDataBaseName;
	private String SqlUserName;
	private String SqlPassword = null;
	private String SqlStatement;
	private String SqlInsertStatement;
	private String BlackListDriver;
	private String BlackListDataBaseName;
	private String BlackListUserName;
	private String BlackListPassword = null;
	private String BlackListStatement;
	private String BlackListRedirectAddress;
	private String SqlJNDILookup;
	private String BlackListJNDILookup;

	private List<Parameter> parameters;

	private List<FbParameter> fbParameters;

	public void addParameter(String name) {
		parameters.add(new Parameter(name));
	}

	public void addParameter(String name, String val) {
		Parameter p = new Parameter(name);
		p.setDefaultValue(val);
		parameters.add(p);
	}

	public void addFbParameter(String name, String ret) {
		if (ret.equalsIgnoreCase("true"))
			fbParameters.add(new FbParameter(name, true));
		else
			fbParameters.add(new FbParameter(name, false));
	}

	public void addFbParameter(String name, String ret, String num,
			String num2, String num3) {
		FbParameter p;

		if (ret.equalsIgnoreCase("true"))
			p = new FbParameter(name, true);
		else
			p = new FbParameter(name, false);

		if (Integer.parseInt(num) != 0)
			p.setNumberInStatement(Integer.parseInt(num));

		if (Integer.parseInt(num2) != 0)
			p.setNumberInBlackListStatement(Integer.parseInt(num2));

		if (Integer.parseInt(num3) != 0)
			p.setNumberInInsertStatement(Integer.parseInt(num3));

		fbParameters.add(p);
	}

	public boolean isDatabaseUsed() {
		return isDatabaseUsed;
	}

	public void setDatabaseUsed(boolean isDatabseUsed) {
		this.isDatabaseUsed = isDatabseUsed;
	}

	public boolean isDatabasePasswordUsed() {
		return isDatabasePasswordUsed;
	}

	public void setDatabasePasswordUsed(boolean isDatabasePasswordUsed) {
		this.isDatabasePasswordUsed = isDatabasePasswordUsed;
	}

	public boolean isBlackListUsed() {
		return isBlackListUsed;
	}

	public void setBlackListUsed(boolean isBlackListUsed) {
		this.isBlackListUsed = isBlackListUsed;
	}

	public boolean isUserBeingInserted() {
		return isUserBeingInserted;
	}

	public String getSqlDriver() {
		return SqlDriver;
	}

	public void setSqlDriver(String sqlDriver) {
		SqlDriver = sqlDriver;
	}

	public String getSqlDataBaseName() {
		return SqlDataBaseName;
	}

	public void setSqlDataBaseName(String sqlDataBaseName) {
		SqlDataBaseName = sqlDataBaseName;
	}

	public String getSqlPassword() {
		return SqlPassword;
	}

	public void setSqlPassword(String sqlPassword) {
		isDatabasePasswordUsed = true;
		SqlPassword = sqlPassword;
	}

	public String getBlackListDriver() {
		return BlackListDriver;
	}

	public void setBlackListDriver(String blackListDriver) {
		BlackListDriver = blackListDriver;
	}

	public String getBlackListDataBaseName() {
		return BlackListDataBaseName;
	}

	public void setBlackListDataBaseName(String blackListDataBaseName) {
		BlackListDataBaseName = blackListDataBaseName;
	}

	public String getBlackListUserName() {
		return BlackListUserName;
	}

	public void setBlackListUserName(String blackListUserName) {
		BlackListUserName = blackListUserName;
	}

	public String getBlackListPassword() {
		return BlackListPassword;
	}

	public void setBlackListPassword(String blackListPassword) {
		isBlackListPasswordUsed = true;
		BlackListPassword = blackListPassword;
	}

	public void setSqlInsertStatement(String insertStatement) {
		isUserBeingInserted = true;
		SqlInsertStatement = insertStatement;
	}

	public String getSqlInsertStatement() {
		return SqlInsertStatement;
	}

	public String getBlackListStatement() {
		return BlackListStatement;
	}

	public void setBlackListStatement(String blackListStatement) {
		BlackListStatement = blackListStatement;
	}

	public List<Parameter> getParametersList() {
		return parameters;
	}

	public List<FbParameter> getFbParametersList() {
		return fbParameters;
	}

	public String getAPP_ID() {
		return APP_ID;
	}

	public void setAPP_ID(String string) {
		APP_ID = string;
	}

	public String getAPP_SECRET() {
		return APP_SECRET;
	}

	public void setAPP_SECRET(String aPP_SECRET) {
		APP_SECRET = aPP_SECRET;
	}

	public String getSqlUserName() {
		return SqlUserName;
	}

	public void setSqlUserName(String sqlUserName) {
		SqlUserName = sqlUserName;
	}

	public String getSqlStatement() {
		return SqlStatement;
	}

	public void setSqlStatement(String sqlStatement) {
		SqlStatement = sqlStatement;
	}

	public String getBlackListRedirectAddress() {
		return BlackListRedirectAddress;
	}

	public void setBlackListRedirectAddress(String blackListRedirectAddress) {
		BlackListRedirectAddress = blackListRedirectAddress;
	}

	public boolean isPasswordUsed() {
		return isDatabasePasswordUsed;
	}

	public void setPasswordUsed(boolean isPasswordUsed) {
		this.isDatabasePasswordUsed = isPasswordUsed;
	}

	public boolean isBlackListPasswordUsed() {
		return isBlackListPasswordUsed;
	}

	public void setBlackListPasswordUsed(boolean isBlackListPasswordUsed) {
		this.isBlackListPasswordUsed = isBlackListPasswordUsed;
	}

	public String getParameters() {

		String out = "";

		for (Parameter param : this.parameters) {

			out = out + param.toString() + ", ";
		}

		if (this.parameters.size() != 0)
			return out.substring(0, out.length() - 2);
		else
			return out;

	}

	public String getParametersDefaultValues() {

		String out = "";

		for (Parameter param : this.parameters) {

			out = out + param.getDefaultValue() + ", ";
		}

		if (this.parameters.size() != 0)
			return out.substring(0, out.length() - 2);
		else
			return out;

	}

	public String getFbParameters() {

		String out = "";

		for (FbParameter param : this.fbParameters) {

			out = out + param.toString() + ", ";
		}

		if (this.fbParameters.size() != 0)
			return out.substring(0, out.length() - 2);
		else
			return out;

	}
	
	public String getSqlJNDILookup()
	{
		return SqlJNDILookup;
	}
	
	public void setSqlJNDILookup(String JNDI)
	{
		isSqlJNDIUsed = true;
		SqlJNDILookup = JNDI;
	}
	
	public String getBlackListJNDILookup()
	{
		return BlackListJNDILookup;
	}
	
	public void setBlackListJNDILookup(String JNDI)
	{
		isBlackListJNDIUsed = true;
		BlackListJNDILookup = JNDI;
	}
	
	public boolean isSqlJNDIUsed()
	{
		return isSqlJNDIUsed;
	}
	
	public boolean isBlackListJNDIUsed()
	{
		return isBlackListJNDIUsed;
	}

	@Override
	public String toString() {
		return "FBConfig [\n APP_ID=" + APP_ID + "\n APP_SECRET=" + APP_SECRET
				+ "\n isDatabaseUsed=" + isDatabaseUsed + "\n isBlackListUsed="
				+ isBlackListUsed + "\n isUserInserted=" + isUserBeingInserted
				+ "\n isPasswordUsed=" + isDatabasePasswordUsed
				+ "\n isBlackListPasswordUsed=" + isBlackListPasswordUsed
				+ "\n SqlDriver=" + SqlDriver + "\n SqlDataBaseName="
				+ SqlDataBaseName + "\n SqlUserName=" + SqlUserName
				+ "\n SqlPassword=" + SqlPassword + "\n SqlStatement="
				+ SqlStatement + "\n InsertStatement=" + SqlInsertStatement
				+ "\n BlackListDriver=" + BlackListDriver
				+ "\n BlackListDataBaseName=" + BlackListDataBaseName
				+ "\n BlackListUserName=" + BlackListUserName
				+ "\n BlackListPassword=" + BlackListPassword
				+ "\n BlackListStatement=" + BlackListStatement
				+ "\n BlackListRedirectAddress=" + BlackListRedirectAddress
				+ "\n Parameters={" + this.getParameters()
				+ "}\n FbParameters={" + this.getFbParameters()
				+ "}\n Permission=(" + this.getPermissions() + ")\n]";
	}

	public String getPermissions() {

		String perm = "";
		boolean isPermissionRequired = false;

		if (this.getFbParameters().contains("bio")
				|| this.getFbParameters().contains("quotes")) {
			isPermissionRequired = true;
			perm += "user_about_me,";
		}

		if (this.getFbParameters().contains("birthday")) {
			isPermissionRequired = true;
			perm += "user_birthday,";
		}

		if (this.getFbParameters().contains("email")) {
			isPermissionRequired = true;
			perm += "email,";
		}

		if (this.getFbParameters().contains("political")
				|| this.getFbParameters().contains("religion")) {
			isPermissionRequired = true;
			perm += "user_religion_politics,";
		}

		if (this.getFbParameters().contains("relationship_status")) {
			isPermissionRequired = true;
			perm += "user_relationships,";
		}

		if (this.getFbParameters().contains("website")) {
			isPermissionRequired = true;
			perm += "user_website,";
		}

		if (isPermissionRequired) {
			perm = "&scope=" + perm;
			String ret = perm.substring(0, (perm.length() - 1));
			return ret;
		}
		else {
			return "";
		}
	}

}