/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_cppumaker.hxx"
#include <stdio.h>
#include <string.h>

#include "cppuoptions.hxx"
#include "osl/thread.h"
#include "osl/process.h"

#ifdef SAL_UNX
#define SEPARATOR '/'
#else
#define SEPARATOR '\\'
#endif

using namespace rtl;

sal_Bool CppuOptions::initOptions(int ac, char* av[], sal_Bool bCmdFile)
	throw( IllegalArgument )
{
	sal_Bool 	ret = sal_True;
	sal_uInt16	i=0;

	if (!bCmdFile)
	{
		bCmdFile = sal_True;

		OString name(av[0]);
		sal_Int32 index = name.lastIndexOf(SEPARATOR);
		m_program = name.copy((index > 0 ? index+1 : 0));

		if (ac < 2)
		{
			fprintf(stderr, "%s", prepareHelp().getStr());
			ret = sal_False;
		}

		i = 1;
	} else
	{
		i = 0;
	}

	char	*s=NULL;
	for( ; i < ac; i++)
	{
		if (av[i][0] == '-')
		{
			switch (av[i][1])
			{
				case 'O':
					if (av[i][2] == '\0')
					{
						if (i < ac - 1 && av[i+1][0] != '-')
						{
							i++;
							s = av[i];
						} else
						{
							OString tmp("'-O', please check");
							if (i <= ac - 1)
							{
								tmp += " your input '" + OString(av[i+1]) + "'";
							}

							throw IllegalArgument(tmp);
						}
					} else
					{
						s = av[i] + 2;
					}

					m_options["-O"] = OString(s);
					break;
				case 'B':
					if (av[i][2] == '\0')
					{
						if (i < ac - 1 && av[i+1][0] != '-')
						{
							i++;
							s = av[i];
						} else
						{
							OString tmp("'-B', please check");
							if (i <= ac - 1)
							{
								tmp += " your input '" + OString(av[i+1]) + "'";
							}

							throw IllegalArgument(tmp);
						}
					} else
					{
						s = av[i] + 2;
					}

					m_options["-B"] = OString(s);
					break;
				case 'T':
					if (av[i][2] == '\0')
					{
						if (i < ac - 1 && av[i+1][0] != '-')
						{
							i++;
							s = av[i];
						} else
						{
							OString tmp("'-T', please check");
							if (i <= ac - 1)
							{
								tmp += " your input '" + OString(av[i+1]) + "'";
							}

							throw IllegalArgument(tmp);
						}
					} else
					{
						s = av[i] + 2;
					}

					if (m_options.count("-T") > 0)
					{
						OString tmp(m_options["-T"]);
						tmp = tmp + ";" + s;
						m_options["-T"] = tmp;
					} else
					{
						m_options["-T"] = OString(s);
					}
					break;
				case 'L':
					if (av[i][2] != '\0')
					{
						OString tmp("'-L', please check");
						if (i <= ac - 1)
						{
							tmp += " your input '" + OString(av[i]) + "'";
						}

						throw IllegalArgument(tmp);
					}

					if (isValid("-C") || isValid("-CS"))
					{
						OString tmp("'-L' could not be combined with '-C' or '-CS' option");
						throw IllegalArgument(tmp);
					}
					m_options["-L"] = OString("");
					break;
				case 'C':
					if (av[i][2] == 'S')
					{
						if (av[i][3] != '\0')
						{
							OString tmp("'-CS', please check");
							if (i <= ac - 1)
							{
								tmp += " your input '" + OString(av[i]) + "'";
							}

							throw IllegalArgument(tmp);
						}

						if (isValid("-L") || isValid("-C"))
						{
							OString tmp("'-CS' could not be combined with '-L' or '-C' option");
							throw IllegalArgument(tmp);
						}
						m_options["-CS"] = OString("");
						break;
					} else
					if (av[i][2] != '\0')
					{
						OString tmp("'-C', please check");
						if (i <= ac - 1)
						{
							tmp += " your input '" + OString(av[i]) + "'";
						}

						throw IllegalArgument(tmp);
					}

					if (isValid("-L") || isValid("-CS"))
					{
						OString tmp("'-C' could not be combined with '-L' or '-CS' option");
						throw IllegalArgument(tmp);
					}
					m_options["-C"] = OString("");
					break;
				case 'G':
					if (av[i][2] == 'c')
					{
						if (av[i][3] != '\0')
						{
							OString tmp("'-Gc', please check");
							if (i <= ac - 1)
							{
								tmp += " your input '" + OString(av[i]) + "'";
							}

							throw IllegalArgument(tmp);
						}

						m_options["-Gc"] = OString("");
						break;
					} else
					if (av[i][2] != '\0')
					{
						OString tmp("'-G', please check");
						if (i <= ac - 1)
						{
							tmp += " your input '" + OString(av[i]) + "'";
						}

						throw IllegalArgument(tmp);
					}

					m_options["-G"] = OString("");
					break;
				case 'X': // support for eXtra type rdbs
                {
					if (av[i][2] == '\0')
					{
						if (i < ac - 1 && av[i+1][0] != '-')
						{
							i++;
							s = av[i];
						} else
						{
							OString tmp("'-X', please check");
							if (i <= ac - 1)
							{
								tmp += " your input '" + OString(av[i+1]) + "'";
							}

							throw IllegalArgument(tmp);
						}
					} else
					{
						s = av[i] + 2;
					}

                    m_extra_input_files.push_back( s );
					break;
                }

				default:
					throw IllegalArgument("the option is unknown" + OString(av[i]));
			}
		} else
		{
			if (av[i][0] == '@')
			{
				FILE* cmdFile = fopen(av[i]+1, "r");
		  		if( cmdFile == NULL )
      			{
					fprintf(stderr, "%s", prepareHelp().getStr());
					ret = sal_False;
				} else
				{
					int rargc=0;
					char* rargv[512];
					char  buffer[512];

					while ( fscanf(cmdFile, "%s", buffer) != EOF )
					{
						rargv[rargc]= strdup(buffer);
						rargc++;
					}
					fclose(cmdFile);

					ret = initOptions(rargc, rargv, bCmdFile);

					for (long j=0; j < rargc; j++)
					{
						free(rargv[j]);
					}
				}
			} else
			{
                if (bCmdFile)
                {
                    m_inputFiles.push_back(av[i]);
                } else
                {
                    OUString system_filepath;
                    if (osl_getCommandArg( i-1, &system_filepath.pData )
                        != osl_Process_E_None)
                    {
                        OSL_ASSERT(false);
                    }
                    m_inputFiles.push_back(OUStringToOString(system_filepath, osl_getThreadTextEncoding()));
                }
			}
		}
	}

	return ret;
}

OString	CppuOptions::prepareHelp()
{
	OString help("\nusing: ");
	help += m_program + " [-options] file_1 ... file_n\nOptions:\n";
	help += "    -O<path>   = path describes the root directory for the generated output.\n";
	help += "                 The output directory tree is generated under this directory.\n";
	help += "    -T<name>   = name specifies a type or a list of types. The output for this\n";
	help += "      [t1;...]   type is generated. If no '-T' option is specified,\n";
	help += "                 then output for all types is generated.\n";
	help += "                 Example: 'com.sun.star.uno.XInterface' is a valid type.\n";
	help += "    -B<name>   = name specifies the base node. All types are searched under this\n";
	help += "                 node. Default is the root '/' of the registry files.\n";
	help += "    -L         = UNO type functions are generated lightweight, that means only\n";
	help += "                 the name and typeclass are given and everything else is retrieved\n";
	help += "                 from the type library dynamically. The default is that UNO type\n";
	help += "                 functions provides enough type information for boostrapping C++.\n";
	help += "                 '-L' should be the default for external components.\n";
	help += "    -C         = UNO type functions are generated comprehensive that means all\n";
	help += "                 necessary information is available for bridging the type in UNO.\n";
	help += "    -G         = generate only target files which does not exists.\n";
	help += "    -Gc        = generate only target files which content will be changed.\n";
	help += "    -X<file>   = extra types which will not be taken into account for generation.\n\n";
	help += prepareVersion();

	return help;
}

OString	CppuOptions::prepareVersion()
{
	OString version(m_program);
	version += " Version 2.0\n\n";
	return version;
}
