package ciscoroutertool.output.formats;

import ciscoroutertool.rules.Rule;
import ciscoroutertool.scanner.FullReport;
import ciscoroutertool.scanner.HostReport;
import nu.xom.Document;
import nu.xom.Element;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

/**
 * Writes output in an XML format
 * @version 0.01ALPHA
 * @author Andrew H. Johnston
 */
public class XMLOutputRenderer extends AbstractOutputRenderer {

    private Element root;
    private Element hostsRoot;

    /**
     * Readies the output renderer
     * @param f the file to save to NOTE: This assumes _file has correct extension
     */
    public XMLOutputRenderer(File f) {
        super(f); //File is now in protected class variable file
        root = new Element("FullReport");
        hostsRoot = new Element("Hosts");
        root.appendChild(hostsRoot);
    }

    /**
     * Adds a host report to the end of the output buffer
     * @param hostReport The report to add to the output
     */
    @Override
    public void addHostReport(HostReport hostReport) {
        ArrayList<Rule> rules = hostReport.getMatchedRules();
        Element host = new Element("Host");

        Element ip = new Element("IP");
        ip.appendChild(String.valueOf(hostReport.getHost()));
        host.appendChild(ip);

        Element scanType = new Element("ScanType");
        scanType.appendChild("Full Scan");
        host.appendChild(scanType);

        Element eRules = new Element("Rules");
        for (Rule rule : rules) {
            Element eRule = new Element("Rule");
            Element ruleName = new Element("RuleName");
            Element severity = new Element("Severity");
            Element description = new Element("Description");

            ruleName.appendChild(rule.getName());
            severity.appendChild(rule.getSeverity());
            description.appendChild(rule.getDescription());

            eRule.appendChild(ruleName);
            eRule.appendChild(severity);
            eRule.appendChild(description);
            eRules.appendChild(eRule);
        }
        host.appendChild(eRules);
        hostsRoot.appendChild(host);
    }

    /**
     * Adds a FullReport object to the output buffer
     *
     * @param fullReport The FullReport object to add
     */
    @Override
    public void addFullReport(FullReport fullReport) {
        ArrayList<HostReport> reports = fullReport.getReports();
        for (HostReport hostReport : reports) {
            this.addHostReport(hostReport);
        }
    }

    /**
     * Writes the data to the Output file
     */
    @Override
    public void writeToFile() throws IOException {
        Document doc = new Document(root);
        FileWriter fw = new FileWriter(file, false);
        fw.write(doc.toXML());
        fw.flush();
        fw.close();
    }
}