package net.sourceforge.rtf.usecases.rtfcode;

import java.io.File;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import net.sourceforge.rtf.RTFTemplate;
import net.sourceforge.rtf.format.rtfcode.RTFCodeString;
import net.sourceforge.rtf.template.IContext;
import net.sourceforge.rtf.usecases.AbstractRTFUseCase;
import net.sourceforge.rtf.usecases.model.Dependency;
import net.sourceforge.rtf.usecases.model.Developer;
import net.sourceforge.rtf.usecases.model.Project;
import net.sourceforge.rtf.usecases.util.UseCaseLog;
import net.sourceforge.rtf.usecases.util.UseCaseUtil;

/**
 * Use case which generate RTF file by using RTFCodeString into RTF table
 * Header.
 * 
 * @version 1.0.1-b12
 * @author <a href="mailto:angelo.zerr@gmail.com">Angelo ZERR</a>
 * 
 */
public class RTFCodeWithVelocity extends AbstractRTFUseCase {

    public RTFCodeWithVelocity(String outDirectory) {
        super(outDirectory);
    }

    protected void putDefaultFormat(RTFTemplate rtfTemplate) {
        /*
         * Set any common formatting objects on the engine - these will be
         * passed through to each template it creates
         */
        rtfTemplate.setDefaultFormat(Date.class, DateFormat.getDateInstance());
    }

    protected void putContext(IContext context) {
        /*
         * Context of simply POJO
         */
        context.put("date", new Date());
        context.put("project", new Project("Jakarta Velocity"));

        // HERE \n will be transform with \\par and \r will be transformed with
        // \\tab
        context.put("header_developer_name", new RTFCodeString(
                "\n\n\rName\n\t\tName2"));
        // Escape { character
        context.put("header_developer_email", new RTFCodeString(
                "\n\n\rName\n\tName2{", true));
        context.put("header_developer_roles", "Roles");
        /*
         * Context of list of POJO (Developers and Dependencies)
         */
        List developers = new ArrayList();
        Developer developer = new Developer("Will Glass-Husain",
                "wglass@apache.org");
        developer.addRole("Java Developer");
        developer.addRole("Release Manager");
        developers.add(developer);
        developer = new Developer("Geir Magnusson Jr.", "geirm@apache.org");
        developer.addRole("Java Developer");
        developer.addRole("Release Manager");
        developers.add(developer);
        developer = new Developer("Daniel L. Rall", "dlr@finemaltcoding.comg");
        developer.addRole("Java Developer");
        developer.addRole("Release Manager");
        developers.add(developer);
        context.put("developers", developers);

        List dependencies = new ArrayList();
        Dependency dependency = new Dependency("commons-collection", "jar",
                "1.0", "http://jakarta.apache.org/commons/collection/");
        dependencies.add(dependency);
        dependency = new Dependency("logkit", "jar", "1.0.1", "http://logkit");
        dependencies.add(dependency);
        dependency = new Dependency("oro", "jar", "2.0.8",
                "http://jakarta.apache.org/oro/");
        dependencies.add(dependency);

        context.put("dependencies", dependencies);

    }

    /**
     * Use case of RTFTemplate with the RTF source model
     * <b>jakarta-velocity-model.rtf</b>. It generate three files into
     * directory <b>usecases/out/jakartavelocityproject</b> :
     * <ul>
     * <li><b>jakarta-velocity-model.rtf.<rtfTemplateImpl>.rtf</b> RTF
     * document transformed.</li>
     * </ul>
     * <ul>
     * <li><b>jakarta-velocity-model.rtf.out.rtf</b> RTF final with value of
     * the context.</li>
     * </ul>
     * <ul>
     * <li><b>jakarta-velocity.fields.xml</b> XML fields available.</li>
     * </ul>
     * 
     * @param args
     */
    public static void main(String[] args) throws Exception {
        String baseDirectory = UseCaseUtil.getBaseDirectory(args);
        UseCaseLog logger = new UseCaseLog();
        logger.logTitle("Start RTFCodeWithVelocity...");
        String outDirectory = baseDirectory + "usecases/out/rtfcode";
        // Create out Directory
        File out = new File(outDirectory);
        out.mkdir();

        // Generate RTF file by using RTF model jakarta-velocity-model.rtf
        String rtfSource = baseDirectory
                + "usecases/models/jakartavelocityproject/jakarta-velocity-model.rtf";
        RTFCodeWithVelocity usecase = new RTFCodeWithVelocity(outDirectory);
        /**
         * Set Velocity as RTFTemplate implementation
         * 
         */
        // usecase.setRtfTemplateImpl(RTFTemplateHelper.DEFAULT_VELOCITY_RTFTEMPLATE);
        // => this line is
        // not required, because by default velocity is the default RTFTemplate
        // implementation
        usecase.saveTransformedDocument(true); // Save RTF file with velocity
                                                // macro
        usecase.run(rtfSource);

        logger.logTitle("GENERATE RTF VELOCITY AND TARGET FILES INTO : "
                + outDirectory);

        // Save XML fields into file with update
        String xmlFieldsAvailable = outDirectory + "/rtfcode.fields.xml";
        usecase.saveXmlFields(xmlFieldsAvailable, false);
        logger.logTitle("GENERATE XML FIELDS AVAIALABLE : "
                + xmlFieldsAvailable);
        logger.logBody(usecase.getXMLFields());

        logger.logTitle("End RTFCodeWithVelocity...");

    }

}
