/*
 * 11/19/04		1.0 moved to LGPL.
 *  
 * 29/01/00		Initial version. mdm@techie.com
 * 
 * 12/12/99     JavaLayer 0.0.7 mdm@techie.com
 * 
 * 14/02/99     MPEG_Args Based Class - E.B
 * Adapted from javalayer and MPEG_Args.
 * Doc'ed and integerated with JL converter. Removed
 * Win32 specifics from original Maplay code.
 *-----------------------------------------------------------------------
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU Library General Public License as published
 *   by the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU Library General Public License for more details.
 *
 *   You should have received a copy of the GNU Library General Public
 *   License along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *----------------------------------------------------------------------
 */

package javazoom.jl.converter;

import java.io.PrintWriter;

import javazoom.jl.decoder.Crc16;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.decoder.OutputChannels;

/**
 * The <code>jlc</code> class presents the JavaLayer
 * Conversion functionality as a command-line program.
 *
 * @since 0.0.7
 */
public class jlc
{

	static public void main(String args[])
	{
		String[] argv;
		long start = System.currentTimeMillis();
		int argc = args.length + 1;
		argv = new String[argc];
		argv[0] = "jlc";
		for(int i=0;i<args.length;i++)
			argv[i+1] = args[i];

		jlcArgs ma = new jlcArgs();
		if (!ma.processArgs(argv))
			System.exit(1);

		Converter conv = new Converter();

		int detail = (ma.verbose_mode ?
					  ma.verbose_level :
				Converter.PrintWriterProgressListener.NO_DETAIL);

		Converter.ProgressListener listener =
			new Converter.PrintWriterProgressListener(
				new PrintWriter(System.out, true), detail);

		try
		{
			conv.convert(ma.filename, ma.output_filename, listener);
		}
		catch (JavaLayerException ex)
		{
			System.err.println("Convertion failure: "+ex);
		}

		System.exit(0);
  }


	/**
	 * Class to contain arguments for maplay.
	 */
	static class jlcArgs
	{
		// channel constants moved into OutputChannels class.
	  //public static final int	both = 0;
	  //public static final int	left = 1;
	  //public static final int	right = 2;
	  //public static final int	downmix = 3;

	  public int				which_c;
	  public int				output_mode;
	  public boolean 			use_own_scalefactor;
	  public float				scalefactor;
	  public String				output_filename;
	  public String				filename;
	  //public boolean 			stdout_mode;
	  public boolean 			verbose_mode;
	  public int				verbose_level = 3;

	  public jlcArgs()
	  {
		which_c = OutputChannels.BOTH_CHANNELS;
		use_own_scalefactor = false;
	   	scalefactor = (float) 32768.0;
	    //stdout_mode = false;
	    verbose_mode = false;
	  }

	  /**
	   * Process user arguments.
	   *
	   * Returns true if successful.
	   */
	  public boolean processArgs(String[] argv)
	  {
		 filename = null;
		 Crc16[] crc;
		 crc = new Crc16[1];
	     int i;
		 int argc = argv.length;

		 //stdout_mode  = false;
	     verbose_mode = false;
	     output_mode = OutputChannels.BOTH_CHANNELS;
	     output_filename = "";
	     if (argc < 2 || argv[1].equals("-h"))
			 return Usage();

	  	 i = 1;
	     while (i < argc)
		 {
		   /* System.out.println("Option = "+argv[i]);*/
		   if (argv[i].charAt(0) == '-')
		   {
			 if (argv[i].startsWith("-v"))
			 {
			 	verbose_mode = true;
				if (argv[i].length()>2)
				{
					try
					{
						String level = argv[i].substring(2);
						verbose_level = Integer.parseInt(level);
					}
					catch (NumberFormatException ex)
					{
						System.err.println("Invalid verbose level. Using default.");
					}
				}
				System.out.println("Verbose Activated (level "+verbose_level+")");
			 }
			 /* else if (argv[i].equals("-s"))
				ma.stdout_mode = true; */
			 else if (argv[i].equals("-p"))
			 {
	      		if (++i == argc)
			  	{
		           System.out.println("Please specify an output filename after the -p option!");
	 	           System.exit (1);
	          	}
		        //output_mode = O_WAVEFILE;
	  		    output_filename = argv[i];
			 }
			 /*else if (argv[i].equals("-f"))
			 {
		        if (++i == argc)
				{
		           System.out.println("Please specify a new scalefactor after the -f option!");
		           System.exit(1);
		   		}
		   	    ma.use_own_scalefactor = true;
		   		// ma.scalefactor = argv[i];
			 }*/
		     else return Usage();
	      }
		  else
		  {
		  	filename = argv[i];
			System.out.println("FileName = "+argv[i]);
			if (filename == null) return Usage();
		  }
		  i++;
	    }
		if (filename == null)
			return Usage();

		return true;
	  }


	   /**
	    * Usage of JavaLayer.
		*/
	   public boolean Usage()
	   {
	  	 System.out.println("JavaLayer Converter :");
		 System.out.println("  -v[x]         verbose mode. ");
		 System.out.println("                default = 2");
	     /* System.out.println("  -s         write u-law samples at 8 kHz rate to stdout");
	     System.out.println("  -l         decode only the left channel");
	     System.out.println("  -r         decode only the right channel");
	     System.out.println("  -d         downmix mode (layer III only)");
	     System.out.println("  -s         write pcm samples to stdout");
	     System.out.println("  -d         downmix mode (layer III only)");*/
	     System.out.println("  -p name    output as a PCM wave file");
	     System.out.println("");
	     System.out.println("  More info on http://www.javazoom.net");
	     /* System.out.println("  -f ushort  use this scalefactor instead of the default value 32768");*/
		 return false;
	   }
	};
};