#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <tdeapplication.h>
#include <tqstring.h>
#include <tqtextstream.h>
#include <tqfile.h>
#include <tdelocale.h>
#include <kdebug.h>
#include <tdeaboutdata.h>
#include <tdecmdlineargs.h>
#include <tqregexp.h>
#include <time.h>
#include <sys/fcntl.h>
#include <unistd.h>

#define dev_urandom  "/dev/urandom"

TQString createStationID()
{
    const int buffersize = 32;
    unsigned char buffer[buffersize];

    TQString stime, srandom = "";
    stime.setNum(time(NULL));

    int fd = open (dev_urandom, O_RDONLY);
    read(fd, buffer, buffersize);
    close(fd);
    for (int i = 0; i < buffersize; ++i)
        srandom += TQString().sprintf("%02X", (unsigned int)buffer[i]);

//    kdDebug() << i18n("generated StationID: ") << stime << srandom << endl;

    return stime + srandom;
}




bool convertFile(const TQString &file)
{
    ////////////////////////////////////////////////////////////////////////
    // read input
    ////////////////////////////////////////////////////////////////////////

    TQFile presetFile (file);

    if (! presetFile.open(IO_ReadOnly)) {
        kdDebug() << "convertFile: "
                  << i18n("error opening preset file")
                  << " " << file << " "
                  << i18n("for reading") << endl;
        return false;
    }

    TQString xmlData;

    // make sure that qtextstream is gone when we close presetFile
    {
        TQTextStream ins(&presetFile);
        ins.setEncoding(TQTextStream::Locale);
        xmlData = ins.read();
    }

    if (xmlData.find("<format>", 0, false) >= 0) {
        kdDebug() << "file " << file << " already in new format" << endl;
        // but add <?xml line at beginning if missing

        {
            presetFile.reset();
            TQTextStream ins(&presetFile);
            ins.setEncoding(TQTextStream::UnicodeUTF8);
            xmlData = ins.read();
        }

        if (xmlData.find("<?xml", 0, false) < 0) {
            xmlData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xmlData;
        }

    } else {

        ////////////////////////////////////////////////////////////////////////
        // convert file
        ////////////////////////////////////////////////////////////////////////

        TQRegExp qselect("<quickselect>.*</quickselect>");
        TQRegExp docking("<dockingmenu>.*</dockingmenu>");
        TQRegExp station("<station>(.*)</station>");
        TQRegExp stationlist("<stationlist>");
        TQRegExp emptyLines("\\n\\s*\\n");

        #define stationIDElement  "stationID"

        qselect.setMinimal(true);
        docking.setMinimal(true);
        station.setMinimal(true);

        xmlData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xmlData;
        xmlData.replace(stationlist, "<stationlist>\n\t\t<format>tderadio-1.0</format>");
        xmlData.replace(qselect, "");
        xmlData.replace(docking, "");
        xmlData.replace(station, "<FrequencyRadioStation>\n"
                             "\t\t\t<" stationIDElement "></" stationIDElement ">"
                             "\\1</FrequencyRadioStation>"
                    );

        int p = 0;
        int f = 0;
        while ( (f = xmlData.find("<" stationIDElement "></" stationIDElement ">", p) ) >= 0) {
            xmlData.insert(f + 2 + TQString(stationIDElement).length(), createStationID());
        }

        xmlData.replace(emptyLines, "\n");
    }

    presetFile.close();


    ////////////////////////////////////////////////////////////////////////
    // write output
    ////////////////////////////////////////////////////////////////////////

    if (! presetFile.open(IO_WriteOnly)) {
        kdDebug() << "convertFile: "
                  << i18n("error opening preset file")
                  << " " << file << " "
                  << i18n("for writing") << endl;
       return false;
    }

    TQTextStream outs(&presetFile);
    outs.setEncoding(TQTextStream::UnicodeUTF8);

    outs << xmlData;

    if (presetFile.status() != IO_Ok) {
        kdDebug() << "StationList::writeXML: "
                  << i18n("error writing preset file")
                  << " " << file
                  << " (" << presetFile.state() << ")"
                  << endl;
        return false;
    }

    return true;
}


static const char *description = "convert-presets";

static TDECmdLineOptions options[] =
{
  { "q", I18N_NOOP("be quiet"), 0},
  { "+[preset files]", I18N_NOOP("preset file to convert"), 0 },
  TDECmdLineLastOption
};

int main(int argc, char *argv[])
{
    TDEAboutData aboutData("convert-presets", I18N_NOOP("convert-presets"),
                         VERSION, description, TDEAboutData::License_GPL,
                         "(c) 2003-2005 Martin Witte",
                         0,
                         "http://sourceforge.net/projects/tderadio",
                         0);
    aboutData.addAuthor("Martin Witte",  "", "witte@kawo1.rwth-aachen.de");

    TDECmdLineArgs::init( argc, argv, &aboutData );
    TDECmdLineArgs::addCmdLineOptions( options ); // Add our own options.

    TDEApplication a (false, false);

    TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs();

    for (int i = 0; i < args->count(); ++i) {
        const char *x = args->arg(i);
        if (! convertFile(x)) {
            return -1;
        } else {
            if (! args->isSet("q"))
                kdDebug() << x << ": ok" << endl;
        }
    }
    if (args->count() == 0) {
        kdDebug() << "no input" << endl;
        return -1;
    }

    return 0;
}
