/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#include "page_autoconnect.h"


#include <tqregexp.h>
#include <klocale.h>
#include <klistview.h>
#include <tqlineedit.h>
#include <tqpushbutton.h>
#include <tqcheckbox.h>
#include <kapplication.h>
#include <kconfig.h>
#include <kdebug.h>
#include <knuminput.h>

#define NAME 0
#define PK   1
#define PASS 2
#define SSL  3

PageAutoConnect::PageAutoConnect( TQWidget *parent, const char *name ) : PageAutoConnectBase( parent, name)
{
    KLVAutoConnect->setSorting( 0 );
    //KLVAutoConnect->header()->hide();

    AddPB->setEnabled(FALSE);
    DeletePB->setEnabled(FALSE);
    PortKI->setValue(6667);
}

PageAutoConnect::~PageAutoConnect()
{
}

void PageAutoConnect::saveConfig()
{

    KConfig *conf = kapp->config();
    conf->setGroup("AutoConnect");

    TQStringList servers;

    for(TQListViewItem *it = KLVAutoConnect->firstChild();
        it != 0;
        it = it->nextSibling()){

	TQString server = it->text(NAME);

	if(it->text(PK).length() > 0)
	    server += ":" + it->text(1);
	if(it->text(SSL).length() > 0)
            server += " (SSL)";
	if(it->text(PASS).length() > 0)
	    server += TQString(" (pass: %1)").arg(it->text(PASS));

        servers << server;

        TQStringList channels;

        for(TQListViewItem *ch = it->firstChild();
            ch != 0;
	    ch = ch->nextSibling()){
	    TQString channel;

	    channel = ch->text(NAME);

	    if(ch->text(PK).length() > 0)
		channel += TQString(" (key: %1)").arg(ch->text(PK));

	    channels << channel;

        }

        channels.sort();
        conf->writeEntry(server, channels);

    }

    servers.sort();

    conf->writeEntry("Servers", servers);

}

void PageAutoConnect::readConfig()
{
    KConfig *conf = kapp->config();
    conf->setGroup("AutoConnect");
    TQStringList servers = conf->readListEntry("Servers");
    servers.sort();
    TQStringList::ConstIterator ser = servers.begin();
    for( ; ser != servers.end(); ser++){
        TQStringList channels = conf->readListEntry(*ser);
	TQString server = *ser;
	TQString port = "6667";
	TQString ssl = TQString::null;
	TQString pass = TQString::null;

	TQRegExp rx("(.+) \\(SSL\\)(.*)");
	if(rx.search(server) >= 0){
            server = rx.cap(1) + rx.cap(3);
            ssl = i18n("SSL");
	}
	rx.setPattern("(.+) \\(pass: (\\S+)\\)(.*)");
	if(rx.search(server) >= 0){
            server = rx.cap(1) + rx.cap(3);
            pass = rx.cap(2);
	}
	rx.setPattern("([^: ]+):(\\d+)");
	if(rx.search(server) >= 0){
            kdDebug(5008) << server << ": Has port:" << rx.cap(2)  << endl;
            server = rx.cap(1);
            port = rx.cap(2);
	}
	kdDebug(5008) << server << ": Done " << port << " " << ssl << " " << pass << endl;
        TQListViewItem *s = new TQListViewItem(KLVAutoConnect, server, port, pass, ssl);
        s->setOpen(TRUE);
        channels.sort();
        TQStringList::ConstIterator chan = channels.begin();
	for(; chan != channels.end(); chan++){
            TQString channel = *chan;
            TQString key = TQString::null;
            TQRegExp crx("(.+) \\(key: (\\S+)\\)");
            if(crx.search(channel) >= 0){
		channel = crx.cap(1);
		key = crx.cap(2);
            }
            new TQListViewItem(s, channel, key);
        }
    }
}

void PageAutoConnect::defaultConfig()
{
    KLVAutoConnect->clear();
    readConfig( );
}

void PageAutoConnect::changed()
{
    emit modified();
}

void PageAutoConnect::add_pressed()
{
    int fnd = 0;
    TQListViewItem *s = 0;

    s = KLVAutoConnect->selectedItem();
    if(!s){ /* new item */
	TQString server = ServerLE->text();
	TQString ssl = TQString::null;
	TQString port;

	port.setNum(PortKI->value());
	if(sslCB->isChecked())
	    ssl = i18n("SSL");

	s = new TQListViewItem(KLVAutoConnect, server, port, PassLE->text(), ssl);
	s->setOpen(TRUE);
	s = new TQListViewItem(s, ChannelLE->text(), KeyLE->text());
        KLVAutoConnect->setCurrentItem(s);
    }
    else { /* update the existing one */
	TQListViewItem *parent;
	TQListViewItem *child;

	if(s->parent()){
	    parent = s->parent();
            child = s;
	}
	else {
	    parent = s;
            child = 0x0;
	}

	parent->setText(NAME, ServerLE->text());
	parent->setText(PK, TQString("%1").arg(PortKI->value()));
	parent->setText(PASS, PassLE->text());
	if(sslCB->isChecked())
	    parent->setText(SSL, i18n("SSL"));
	else
	    parent->setText(SSL, TQString::null);

	if(child){
	    child->setText(NAME, ChannelLE->text());
	    child->setText(PK, KeyLE->text());
	}
	else {
	    if(ChannelLE->text().length() > 0){
                fnd = 0;
		TQListViewItem *c = parent->firstChild();
		for( ; c != 0 && fnd == 0; c = c->nextSibling()){
		    if(c->text(NAME) == ChannelLE->text()){
			c->setText(PK, KeyLE->text());
			fnd = 1;
		    }
		}
		if(fnd == 0){
		    new TQListViewItem(parent, ChannelLE->text(), KeyLE->text());
		}
	    }
	}

    }
    changed();
}

void PageAutoConnect::new_pressed()
{
    AddPB->setText(i18n("&Add"));
    ServerLE->clear();
    ChannelLE->clear();
    sslCB->setChecked(false);
    PassLE->clear();
    KeyLE->clear();
    KLVAutoConnect->clearSelection();
    PortKI->setValue(6667) ;
}

void PageAutoConnect::delete_pressed()
{
    for(TQListViewItem *it = KLVAutoConnect->firstChild();
        it != 0;
        it = it->nextSibling()){

        if(it->text(NAME) == ServerLE->text()){
            if(ChannelLE->text().isEmpty() == FALSE){
                for(TQListViewItem *ch = it->firstChild();
                    ch != 0;
                    ch = ch->nextSibling()){
                    if(ch->text(NAME) == ChannelLE->text()){
                        delete ch;
                        changed();
                        ChannelLE->clear();
                        ServerLE->clear();
                        return;
                    }
                }
            }
            else {
                delete it;
                changed();
                ServerLE->clear();
                return;
            }
        }
    }
    changed();
}

void PageAutoConnect::kvl_clicked(TQListViewItem *it)
{
    if(it != 0){
	if(it->parent() != 0){
	    ChannelLE->setText(it->text(NAME));
	    KeyLE->setText(it->text(PK));
	    AddPB->setText(i18n("&Update"));
	    /*
	     * Move it to the parent to setup parent/server
	     * values.  This save writing this code
	     * in two places.
	     */
	    it = it->parent();
	}
	else {
	    AddPB->setText(i18n("&Update/Add"));
	    ChannelLE->clear();
	    KeyLE->clear();
	}

	if(it->parent() == 0){
	    ServerLE->setText(it->text(NAME));
	    PortKI->setValue(it->text(PK).toInt());
            PassLE->setText(it->text(PASS));
	    if(it->text(SSL).length() > 0)
		sslCB->setChecked(true);
	    else
		sslCB->setChecked(false);
	}
	/*
	 * Make sure to do this after changing all the fields
         */
	AddPB->setEnabled(false);
        DeletePB->setEnabled(true);


    }
    else {
	AddPB->setEnabled(false);
	DeletePB->setEnabled(false);
    }
    changed();
}

void PageAutoConnect::item_changed() {
    AddPB->setEnabled(true);
}

#include "page_autoconnect.moc"