/*********************************************************************
 *
 *    Application Launch Point and CLI for MPFS21
 *
 *********************************************************************
 * FileName:        Program.cs
 * Dependencies:    Microsoft .NET Framework 2.0
 * Processor:       x86
 * Complier:        Microsoft Visual C# 2008 Express Edition
 * Company:         Microchip Technology, Inc.
 *
 * Software License Agreement
 *
 * This software is owned by Microchip Technology Inc. ("Microchip") 
 * and is supplied to you for use exclusively as described in the 
 * associated software agreement.  This software is protected by 
 * software and other intellectual property laws.  Any use in 
 * violation of the software license may subject the user to criminal 
 * sanctions as well as civil liability.  Copyright 2008 Microchip
 * Technology Inc.  All rights reserved.
 *
 *
 * THE SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT 
 * WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT 
 * LIMITATION, ANY WARRANTY OF MERCHANTABILITY, FITNESS FOR A 
 * PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL 
 * MICROCHIP BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR 
 * CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF 
 * PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS 
 * BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE 
 * THEREOF), ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER 
 * SIMILAR COSTS, WHETHER ASSERTED ON THE BASIS OF CONTRACT, TORT 
 * (INCLUDING NEGLIGENCE), BREACH OF WARRANTY, OR OTHERWISE.
 *
 *
 * Author               Date   		Comment
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Elliott Wood		4/17/2008	    Original
 ********************************************************************/
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
using Microchip;

namespace MPFS21
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(String[] args)
        {
            // If no arguments, show the GUI
            if (args.Length == 0)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new MPFS21Form());
            }
            // Operate in command line mode
            else
            {

                // Make sure we got at least 3 parameters
                if (args.Length < 3)
                {
                    MessageBox.Show(
                        "Usage: MPFS2 [options] <SourceDir> <ProjectDir> <OutputFile>\n" +
                        "    /BIN\t\t(/b)\t: Output a BIN image (Default)\n" +
                        "    /C18\t\t(/c)\t: Output a C18 image\n" +
                        "    /ASM30\t(/s)\t: Output an ASM30 image\n" +
                        "    /C32\t\t(/x)\t: Output a C32 image\n" +
                        "    /classic\t\t(/1)\t: MPFSClassic format\n" +
                        "    /mpfs2\t\t(/2)\t: MPFS2 format (Default)\n" +
                        "    /reserve #\t(/r #)\t: Reserved space for Classic BINs (Default 64)\n" +
                        "    /html \"...\"\t(/h)\t: Dynamic file types (\"*.htm, *.html, *.xml, *.cgi\")\n" +
                        "    /xgzip \"...\"\t(/z)\t: Non-compressible types (\"snmp.bib, *.inc\")\n\n" +
                        "SourceDir, ProjectDir, and OutputFile are required and should be enclosed in quotes.\n" +
                        "OutputFile is placed relative to ProjectDir and *CANNOT* be a full path name.",
                        "MPFS2 Console Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    return;
                }

                // Locate the parameters
                String sourceDir = args[args.Length - 3];
                String projectDir = args[args.Length - 2];
                String outputFile = args[args.Length - 1];

                // Set up some defaults
                MPFSOutputFormat fmt = MPFSOutputFormat.BIN;
                byte version = 2;
                int reserveBlock = 64;
                String htmlTypes = "*.htm, *.html, *.xml, *.cgi";
                String noGZipTypes = "*.inc, snmp.bib";

                // Process each command line argument
                for(int i =0; i < args.Length - 3; i++)
                {
                    String arg = args[i].ToLower();

			        // Check for output format parameters
			        if(arg == "/bin" || arg == "/b")
				        fmt = MPFSOutputFormat.BIN;
			        else if(arg == "/c18" || arg == "/c")
				        fmt = MPFSOutputFormat.C18;
			        else if(arg == "/asm30" || arg == "/s")
				        fmt = MPFSOutputFormat.ASM30;
			        else if(arg == "/c32" || arg == "/x")
				        fmt = MPFSOutputFormat.C32;
			        else if(arg == "/classic" || arg == "/1")
				        version = 1;
			        else if(arg == "/mpfs2" || arg == "/2")
				        version = 2;

                    // Check for string parameters
			        else if(arg == "/reserve" || arg == "/r")
				        reserveBlock = Convert.ToInt32(args[++i]);
			        else if(arg == "/html" || arg == "/h")
				        htmlTypes = args[++i];
			        else if(arg == "/xgzip" || arg == "/z")
				        noGZipTypes = args[++i];

                    else
                    {
                        MessageBox.Show("The command-line option \""+arg+"\" was not recognized.",
					        "MPFS2 Console Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
				        return;
                    }
                }

                // Set up an appropriate builder
                MPFSBuilder builder;
                if (version == 2)
                {
                    builder = new MPFS2Builder(projectDir, outputFile);
                    ((MPFS2Builder)builder).DynamicTypes = htmlTypes;
                    ((MPFS2Builder)builder).NonGZipTypes = noGZipTypes;
                }
                else
                {
                    builder = new MPFSClassicBuilder(projectDir, outputFile);
                    ((MPFSClassicBuilder)builder).ReserveBlock = (UInt32)reserveBlock;
                }

                // Add the files to the image and generate the image
                builder.AddDirectory(sourceDir, "");

                // Generate the image and trap errors
                if (!builder.Generate(fmt))
                {
                    LogWindow dlg = new LogWindow();
                    dlg.Image = SystemIcons.Error;
                    dlg.Message = "An error was encountered during generation.";
                    dlg.Log = builder.Log;
                    dlg.ShowDialog();
                    return;
                }
            }
        }
    }
}
