/*
 *                    BioJava development code
 *
 * This code may be freely distributed and modified under the
 * terms of the GNU Lesser General Public Licence.  This should
 * be distributed with the code.  If you do not have a copy,
 * see:
 *
 *      http://www.gnu.org/copyleft/lesser.html
 *
 * Copyright for this code is held jointly by the individual
 * authors.  These should be listed in @author doc comments.
 *
 * For more information on the BioJava project and its aims,
 * or to join the biojava-l mailing list, visit the home page
 * at:
 *
 *      http://www.biojava.org/
 *
 */
package org.biojava.nbio.survival.cox;

import java.text.DecimalFormat;
import java.util.LinkedHashMap;

/**
 *
 * @author Scooter Willis 
 */
public class CoxVariables {

	//   public GeneSetResults gsr;
	private String cohortName = "";
	private String geneSet = "";
	private String genes = "";

	/**
	 *
	 * @param cohortName
	 * @param geneSet
	 * @param genes
	 */
	public CoxVariables(String cohortName, String geneSet, String genes) {
		this.cohortName = cohortName;
		this.geneSet = geneSet;
		this.genes = genes;
	}

	/**
	 * Need a unique id from String
	 *
	 * @return
	 */
	public int getUniqueID() {
		String link = geneSet + "_" + cohortName;
		return link.hashCode();
	}
	private LinkedHashMap<String, CoxInfo> coxInfoHashMap = new LinkedHashMap<>();

	/**
	 *
	 * @param name
	 * @param coxInfo
	 */
	public void putCoxInfo(String name, CoxInfo coxInfo) {
		coxInfoHashMap.put(name, coxInfo);

	}

	/**
	 *
	 * @param name
	 * @return
	 */
	public CoxInfo getCoxInfo(String name) {
		return coxInfoHashMap.get(name);

	}

	/**
	 *
	 * @param file
	 * @return
	 */
	public String encodeFileURL(String file) {
		file = file.replaceAll(" ", "%20");
		file = file.replaceAll("<", "%3C");
		file = file.replaceAll(">", "%3E");
		return file;
	}
	//   static GeneProfiler geneProfiler = null;

	/**
	 *
	 * @param d
	 * @param precision
	 * @param pad
	 * @return
	 */
	public static String fmt(Double d, int precision, int pad) {
		String value = "";
		DecimalFormat dfe = new DecimalFormat("0.00E0");
		String dpad = "0.";
		double p = 1.0;
		for (int i = 0; i < (precision); i++) {
			dpad = dpad + "0";
			p = p / 10.0;
		}
		DecimalFormat df = new DecimalFormat(dpad);
		if (Math.abs(d) >= p) {
			value = df.format(d);
		} else {
			value = dfe.format(d);
		}
		int length = value.length();
		int extra = pad - length;
		if (extra > 0) {
			for (int i = 0; i < extra; i++) {
				value = " " + value;
			}
		}
		return value;
	}

	@Override
	public String toString() {
		String coxOutput = geneSet + "\r\n";
		//    co = co + genes + "\r\n";
		coxOutput = coxOutput + cohortName + "," + genes.replace(',', ' ') + "\r\n";
		coxOutput = coxOutput + ",Coe,StdErr,p-value,HR,HR Lo 95%,HR Hi 95%\r\n";
		for (String variables : coxInfoHashMap.keySet()) {
			CoxInfo ci = coxInfoHashMap.get(variables);

			coxOutput = coxOutput + "Overall Model Fit p-value=" + fmt(ci.getOverallModelFitPvalue(), 5, 0) + "\r\n";
			coxOutput = coxOutput + ci.getCoefficientText(false, "", ",", "", "");
			coxOutput = coxOutput + "\r\n";


		}

		return coxOutput;
	}

	/**
	 * @return the cohortName
	 */
	public String getCohortName() {
		return cohortName;
	}

	/**
	 * @return the geneSet
	 */
	public String getGeneSet() {
		return geneSet;
	}

	/**
	 * @return the genes
	 */
	public String getGenes() {
		return genes;
	}

	/**
	 * @return the coxInfoHashMap
	 */
	public LinkedHashMap<String, CoxInfo> getCoxInfoHashMap() {
		return coxInfoHashMap;
	}
}
