/**********************************************************************
** Copyright (C) 2002 Detlev Offenbach <detlev@die-offenbachs.de>
**
** This is a modified version of lupdate. The original is part of TQt-Linguist.
** The copyright of the original file can be found below.
**
** This version is modified to handle python sources.
**
**   The file is provided AS IS with NO WARRANTY OF ANY KIND,
**   INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR
**   A PARTICULAR PURPOSE.
**
**********************************************************************/


/**********************************************************************
**   Copyright (C) 2000 Trolltech AS.  All rights reserved.
**
**   main.cpp
**
**   This file is part of TQt Linguist.
**
**   See the file LICENSE included in the distribution for the usage
**   and distribution terms.
**
**   The file is provided AS IS with NO WARRANTY OF ANY KIND,
**   INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR
**   A PARTICULAR PURPOSE.
**
**********************************************************************/

#include <tqfile.h>
#include <tqstring.h>
#include <tqstringlist.h>
#include <tqtextstream.h>

#include <errno.h>
#include <metatranslator.h>
#include <proparser.h>
#include <string.h>

// defined in fetchtr.cpp
extern void fetchtr_py( const char *fileName, MetaTranslator *tor,
			 const char *defaultContext, bool mustExist );

// defined in merge.cpp
extern void merge( MetaTranslator *tor, const MetaTranslator *virginTor,
		   bool verbose );

typedef TQValueList<MetaTranslatorMessage> TML;

static void printUsage()
{
    tqWarning( "Usage: pytqlupdate [options] file.pro...\n"
	      "Options:\n"
	      "    -help  Display this information and exits\n"
	      "    -noobsolete\n"
	      "           Drop all obsolete strings\n"
	      "    -verbose\n"
	      "           Explain what is being done\n"
	      "    -version\n"
	      "           Display the version of pytqlupdate and exits" );
}

int main( int argc, char **argv )
{
    bool verbose = false;
    bool noObsolete = false;
    bool metSomething = false;
    int numProFiles = 0;

    for ( int i = 1; i < argc; i++ ) {
        if ( qstrcmp(argv[i], "-help") == 0 ) {
            printUsage();
            return 0;
        } else if ( qstrcmp(argv[i], "-noobsolete") == 0 ) {
            noObsolete = true;
            continue;
        } else if ( qstrcmp(argv[i], "-verbose") == 0 ) {
            verbose = true;
            continue;
        } else if ( qstrcmp(argv[i], "-version") == 0 ) {
            tqWarning( "pytqlupdate version %s", TQT_VERSION_STR );
            return 0;
        }

        numProFiles++;
        TQFile f( argv[i] );
        if ( !f.open(IO_ReadOnly) ) {
            tqWarning( "pytqlupdate error: Cannot open project file '%s': %s",
		      argv[i], strerror(errno) );
            return 1;
        }

        TQTextStream t( &f );
        TQString fullText = t.read();
        f.close();
        
        MetaTranslator fetchedTor;
        TQString defaultContext = "@default";
        TQCString codec;
        TQStringList translatorFiles;
        TQStringList::Iterator tf;
        
        TQMap<TQString, TQString> tagMap = proFileTagMap( fullText );
        TQMap<TQString, TQString>::Iterator it;

        for ( it = tagMap.begin(); it != tagMap.end(); ++it ) {
            TQStringList toks = TQStringList::split( TQChar(' '), it.data() );
            TQStringList::Iterator t;
            
            for ( t = toks.begin(); t != toks.end(); ++t ) {
                if ( it.key() == TQString("SOURCES") ) {
                    fetchtr_py( *t, &fetchedTor, 
                     defaultContext, true );
                    metSomething = true;
                } else if ( it.key() == TQString("TRANSLATIONS") ) {
                    translatorFiles.append( *t );
                    metSomething = true;
                } else if ( it.key() == TQString("CODEC") ) {
                    codec = (*t).utf8();
                }
            }
        }

        for ( tf = translatorFiles.begin(); tf != translatorFiles.end(); ++tf ) {
            MetaTranslator tor;
            tor.load( *tf );
            if ( !codec.isEmpty() )
                tor.setCodec( codec );
            if ( verbose )
                tqWarning( "Updating '%s'...", (*tf).local8Bit().data() );
            merge( &tor, &fetchedTor, verbose );
            if ( noObsolete )
                tor.stripObsoleteMessages();
            tor.stripEmptyContexts();
            if ( !tor.save(*tf) )
                tqWarning( "pytqlupdate error: Cannot save '%s': %s", (*tf).local8Bit().data(),
                  strerror(errno) );
        }
        if ( !metSomething ) {
            tqWarning( "pytqlupdate warning: File '%s' does not look like a project"
		      " file", argv[i] );
        } else if ( translatorFiles.isEmpty() ) {
            tqWarning( "pytqlupdate warning: Met no 'TRANSLATIONS' entry in project"
		      " file '%s'", argv[i] );
        }
    }
    
    if ( numProFiles == 0 ) {
        printUsage();
        return 1;
    }
    return 0;
}
