/*=========================================================================

  Program:   WXDialog - wxWidgets X-platform GUI Front-End for CMake
  Module:    $RCSfile: CommandLineInfo.cpp,v $
  Language:  C++
  Date:      $Date: 2012/03/29 17:21:10 $
  Version:   $Revision: 1.1.1.1 $

  Author:    Jorgen Bodde

  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.

     This software is distributed WITHOUT ANY WARRANTY; without even 
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/

// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "CommandLineInfo.h" 

#include "cmSystemTools.h"

///////////////////////////////////////////////////////////////
// cmCommandLineInfo 

cmCommandLineInfo::cmCommandLineInfo()
{
    m_WhereSource = _("");
    m_WhereBuild = _("");
    m_AdvancedValues = false;
    m_GeneratorChoiceString.Empty();
    m_LastUnknownParameter = "";
    m_ValidArguments = "";
    m_ExitAfterLoad = false;
} 

///////////////////////////////////////////////////////////////
cmCommandLineInfo::~cmCommandLineInfo()
{
}

///////////////////////////////////////////////////////////////
bool cmCommandLineInfo::ParseCommandLine(int argc, char* argv[])
{
    bool result = true;
    wxString cachePath;
    
    // parse all commands
    int cc = 1;
    if(argc < cc)
        return true;    // no command line options

    while(cc < argc)
    {
        wxString arg = argv[cc];

        // if we have a switch
        if(arg.Len() > 1 && arg.GetChar(0) == '-')
        {
            int next_argc = ParseSwitch(argv, cc, argc);
            if(next_argc > 0)
                cc += next_argc;
            else
                return false; // sorry error while parsing
        }
        else
        {
            // gather all what is left
            for(int leftcc = cc; leftcc < argc; leftcc++)
            {
                if(cc != leftcc)
                    m_WhereBuild << _(" ");
                m_WhereBuild << argv[leftcc];
            }
            break;
        }
    }

    m_ExecutablePath = cmSystemTools::GetFilenamePath(argv[0]).c_str();

    return true;
}

///////////////////////////////////////////////////////////////
int cmCommandLineInfo::GetBoolValue(const wxString& v) {

    wxString value = v.Lower();
  
    if (!value.Cmp("1") || 
        !value.Cmp("on") || 
        !value.Cmp("true") || 
        !value.Cmp("yes"))
    {
        // true
        return 1;
    }
    else if (!value.Cmp("0") || 
             !value.Cmp("off") || 
             !value.Cmp("false") || 
             !value.Cmp("no"))
    {
        // false
        return -1;
    }

    // not recognised
    return 0;
}

///////////////////////////////////////////////////////////////
// Parse param

size_t cmCommandLineInfo::ParseSwitch(char **argv, int arg_index, int argc)
{        
    wxString param = argv[arg_index];
    
    // we need this for a switch, at least 2
    if(param.Len() > 1)
    {
        // determine switch type
        switch (param.GetChar(1))
        {
        case 'G':
            // when it's G<.....> we split else we take the 
            // other argc
            if(param.Len() > 2)
            {
                m_GeneratorChoiceString = GetStringParam(param.Mid(2));
                return 1;   // one arg is passed
            }
            else
            {
                if((arg_index+1) < argc)
                {
                    m_GeneratorChoiceString = GetStringParam(wxString(argv[arg_index+1]));
                    return 2;   // two args are passed
                }
            }
            // no luck
            return 0;
    
        case 'Q':
            m_ExitAfterLoad = true;
            return 1;

        // unknown param
        default:
            break;
        }
    }

    // error, unrecognised or too small arg
    return 0;
}

// When the string param given has string quotes around it
// we remove them and we pass back the string. If not, we 
// simply pass back the string as-is
wxString cmCommandLineInfo::GetStringParam(const wxString &str)
{
    wxString mystr = str.Strip(wxString::both);

    // if we have only one (or no chars return the current string)
    if(mystr.Len() < 2)
        return str;

    // if we have quotes
    if(mystr.GetChar(0) == '\"' && mystr.Last() == '\"')
    {
        // when we only have 2 in size, return empty string
        if(mystr.Len() == 2)
            return wxEmptyString;

        // now remove the outer and inner, and return
        return mystr.Mid(1, mystr.Len()-1);
    }

    return str;
}
