package neu.lab.conflict.writer;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;

import neu.lab.conflict.container.DepJars;
import neu.lab.conflict.statics.ClassDup;
import neu.lab.conflict.statics.ClassDups;
import neu.lab.conflict.statics.DupClsJarPair;
import neu.lab.conflict.statics.DupClsJarPairs;
import neu.lab.conflict.util.MavenUtil;
import neu.lab.conflict.util.UserConf;
import neu.lab.conflict.risk.DepJarCgs;
import neu.lab.conflict.risk.FourRow;

public class ClassDupRiskWriter {

	private ClassDups classDups;

	private DupClsJarPairs jarPairs;

	public ClassDupRiskWriter() {
		classDups = new ClassDups(DepJars.i());
	}


	public void writeByClass() {
		try {
			PrintWriter printer = new PrintWriter(
					new BufferedWriter(new FileWriter(new File(UserConf.getOutDir() + "classDupRisk.txt"), true)));
			printer.println("===============projectPath->" + MavenUtil.i().getProjectInfo());

			printer.println("=====class duplicate:");
			for (ClassDup classDup : classDups.getAllClsDup()) {
				printer.println(classDup.getRiskString());
			}
			printer.println("\n\n\n\n");
			printer.close();
		} catch (Exception e) {
			MavenUtil.i().getLog().error("can't write classDupByClass:", e);
		}
	}

	public void writeByJar(String outPath,boolean append) {
		try {
			PrintWriter printer = new PrintWriter(new BufferedWriter(new FileWriter(new File(outPath), append)));
			printer.println("===============projectPath->" + MavenUtil.i().getProjectInfo());

			for (DupClsJarPair jarPair : getJarPairs().getAllJarPair()) {
				printer.println(jarPair.getRiskString());
			}
			printer.println("\n\n\n\n");
			printer.close();
		} catch (Exception e) {
			MavenUtil.i().getLog().error("can't write classDupByJar:", e);
		}
	}

	public void writeRchNum(String outPath, boolean append) {
		try {
			CSVPrinter printer = new CSVPrinter(new FileWriter(outPath, append), CSVFormat.DEFAULT);
			DepJarCgs jarCgs = new DepJarCgs();
			for (DupClsJarPair jarPair : getJarPairs().getAllJarPair()) {
				FourRow fourRow = jarPair.getPairRisk(jarCgs).getFourRow();
				printer.printRecord(fourRow.mthdRow);
				printer.printRecord(fourRow.mthdNameRow);
				printer.printRecord(fourRow.serviceRow);
				printer.printRecord(fourRow.serviceNameRow);
			}
			printer.close();
		} catch (Exception e) {
			MavenUtil.i().getLog().error("can't write reach class number:", e);
		}
	}

	private DupClsJarPairs getJarPairs() {
		if (jarPairs == null)
			jarPairs = new DupClsJarPairs(classDups);
		return jarPairs;
	}
}