package page.tools.xml;

import java.io.IOException;
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.wikiwebserver.core.WikiWebServer;
import org.wikiwebserver.handler.http.HTTPException;
import org.wikiwebserver.handler.http.HTTPHandler;
import org.wikiwebserver.handler.http.interfaces.HTTPResponder;

public class PADResponder implements HTTPResponder {
    
    private CompanyDetails company;
    private ProgramDetails program;
    
    public PADResponder(CompanyDetails company, ProgramDetails program) {
        this.company = company;
        this.program = program;
    }

    public Object respond(HTTPHandler conn) throws IOException {
        
        conn.getResponse().getHeaders().set("Content-Type", "text/xml");
        conn.getResponse().getHeaders().set("Content-disposition", "inline; " +
        		"filename=" + program.getFilenameLong() + ".xml");
        
        return getPAD(this.company, this.program);
    } 
    

    
    public static String getPAD(CompanyDetails company, ProgramDetails program) throws HTTPException {
        
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder db  = dbf.newDocumentBuilder();
            Document doc = db.newDocument();
            
            Element dizInfo = doc.createElement("XML_DIZ_INFO");
            
            Element padInfo = doc.createElement("MASTER_PAD_VERSION_INFO");
            Element padVersion = doc.createElement("MASTER_PAD_VERSION");
            padVersion.setTextContent("3.01");
            Element editorVersion = doc.createElement("MASTER_PAD_EDITOR");
            editorVersion.setTextContent("WikiWebServer " + WikiWebServer.VERSION_CODE);
            Element editorInfo = doc.createElement("MASTER_PAD_INFO");
            editorInfo.setTextContent("Dynamically generated by WikiWebServer");            
            padInfo.appendChild(padVersion);
            padInfo.appendChild(editorVersion);
            padInfo.appendChild(editorInfo);
    
            dizInfo.appendChild(padInfo);
            
            dizInfo.appendChild(company.getInfoNode(doc));
            dizInfo.appendChild(program.getInfoNode(doc));
            dizInfo.appendChild(program.getDescriptionsNode(doc));
            dizInfo.appendChild(program.getWebInfoNode(doc));
            dizInfo.appendChild(program.getPermissionsNode(doc));
        
            doc.appendChild(dizInfo);

            StringWriter writer = new StringWriter();
            
            // Prepare the DOM document for writing
            Source source = new DOMSource(doc);
            Result result = new StreamResult(writer);

            // Write the DOM document to the file
            Transformer xformer = TransformerFactory.newInstance().newTransformer();
            xformer.transform(source, result);
            
            writer.close();
            
            return writer.toString();
            
        } catch (Exception e) {
            throw new HTTPException(500, "Failed to generate PAD", e);
        }
    }
}


