/*
 *     Copyright (C) 2007 by Thorsten Staerk and Mathias Soeken <msoeken@tzi.de>
 *
 *   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.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License along
 *   with this program; if not, write to the
 *      Free Software Foundation, Inc.
 *      51 Franklin Street, Fifth Floor
 *      Boston, MA  02110-1301  USA.
 *
 */

#include "historydialog.h"
#include "ui_historydialog.h"
#include "taskview.h"
#include "kttcalendar.h"

#include <QItemDelegate>
#include <KDateTimeWidget>
#include <KMessageBox>
#include <KDebug>

class HistoryWidgetDelegate : public QItemDelegate
{

public:
    HistoryWidgetDelegate( QObject *parent = 0 ) : QItemDelegate( parent ) {}

    QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &) const
    {
        KDateTimeWidget *editor = new KDateTimeWidget( parent );
        editor->setAutoFillBackground( true );
        editor->setPalette( option.palette );
        editor->setBackgroundRole( QPalette::Background );
        return editor;
    }

    void setEditorData( QWidget *editor, const QModelIndex &index ) const
    {
        QDateTime dateTime = QDateTime::fromString( index.model()->data( index, Qt::DisplayRole ).toString(), "yyyy-MM-dd HH:mm:ss" );
        KDateTimeWidget *dateTimeWidget = static_cast<KDateTimeWidget*>( editor );
        dateTimeWidget->setDateTime( dateTime );
    }

    void setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
    {
        KDateTimeWidget *dateTimeWidget = static_cast<KDateTimeWidget*>( editor );
        QDateTime dateTime = dateTimeWidget->dateTime();
        model->setData( index, dateTime.toString( "yyyy-MM-dd HH:mm:ss" ), Qt::EditRole );
    }

    void updateEditorGeometry( QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const
    {
        editor->setGeometry( option.rect );
    }
};

historydialog::historydialog(TaskView *parent) :
    QDialog(parent),
    m_ui(new Ui::historydialog)
{
    mparent=parent;
    m_ui->setupUi(this);
    /* Item Delegate for displaying KDateTimeWidget instead of QLineEdit */
    HistoryWidgetDelegate *historyWidgetDelegate = new HistoryWidgetDelegate( m_ui->historytablewidget );
    m_ui->historytablewidget->setItemDelegateForColumn( 1, historyWidgetDelegate );
    m_ui->historytablewidget->setItemDelegateForColumn( 2, historyWidgetDelegate );

    m_ui->historytablewidget->setEditTriggers( QAbstractItemView::AllEditTriggers );
    m_ui->historytablewidget->setColumnCount(5);
    m_ui->historytablewidget->setHorizontalHeaderLabels(
    QStringList() << i18n( "Task" ) << i18n( "StartTime" ) << i18n( "EndTime" )
                  << i18n( "Comment" ) << QString( "event UID" ) );
    m_ui->historytablewidget->horizontalHeader()->setStretchLastSection( true );
    m_ui->historytablewidget->setColumnHidden( 4, true );  // hide the "UID" column
    listallevents();
    m_ui->historytablewidget->setSortingEnabled( true );
    m_ui->historytablewidget->sortItems( 1, Qt::DescendingOrder );
    m_ui->historytablewidget->resizeColumnsToContents();
}

historydialog::~historydialog()
{
    delete m_ui;
}

QString historydialog::listallevents()
{
    QString err=QString();
    // if sorting is enabled and we write to row x, we cannot be sure row x will be in row x some lines later
    bool old_sortingenabled=m_ui->historytablewidget->isSortingEnabled();
    m_ui->historytablewidget->setSortingEnabled( false );
    connect(  m_ui->historytablewidget, SIGNAL(cellChanged(int,int)),
              this, SLOT(historyWidgetCellChanged(int,int)) );

    KCalCore::Event::List eventList = mparent->storage()->rawevents();
    KTimeTracker::KTTCalendar::Ptr calendar = mparent->storage()->calendar();
    for ( KCalCore::Event::List::iterator i = eventList.begin();
        i != eventList.end(); ++i )
    {
        int row =  m_ui->historytablewidget->rowCount();
        m_ui->historytablewidget->insertRow( row );
        QTableWidgetItem* item=0;
        if ( !(*i)->relatedTo().isEmpty() ) // maybe the file is corrupt and (*i)->relatedTo is NULL
        {
            KCalCore::Incidence::Ptr parent = calendar ? calendar->incidence( (*i)->relatedTo() ) : KCalCore::Incidence::Ptr();
            item = new QTableWidgetItem( parent ? parent->summary() : QString() );
            item->setFlags( Qt::ItemIsEnabled );
            item->setWhatsThis( i18n( "You can change this task's comment, start time and end time." ) );
            m_ui->historytablewidget->setItem( row, 0, item );
            // dtStart is stored like DTSTART;TZID=Europe/Berlin:20080327T231056
            // dtEnd is stored like DTEND:20080327T231509Z
            // we need to handle both differently
            QDateTime start = QDateTime::fromTime_t( (*i)->dtStart().toTime_t() );
            QDateTime end = QDateTime::fromString( (*i)->dtEnd().toString(), Qt::ISODate );
            kDebug() << "start =" << start << "; end =" << end;
            m_ui->historytablewidget->setItem( row, 1, new QTableWidgetItem( start.toString( "yyyy-MM-dd HH:mm:ss" ) ) );
            m_ui->historytablewidget->setItem( row, 2, new QTableWidgetItem( end.toString( "yyyy-MM-dd HH:mm:ss" ) ) );
            m_ui->historytablewidget->setItem( row, 4, new QTableWidgetItem( (*i)->uid() ) );
            kDebug() <<"(*i)->comments.count() ="  << (*i)->comments().count();
            if ( (*i)->comments().count() > 0 )
            {
                m_ui->historytablewidget->setItem( row, 3, new QTableWidgetItem( (*i)->comments().last() ) );
            }
        }
        else
        {
            kDebug(5970) << "There is no 'relatedTo' entry for " << (*i)->summary();
            err="NoRelatedToForEvent";
        }
    }
    m_ui->historytablewidget->resizeColumnsToContents();
    m_ui->historytablewidget->setColumnWidth( 1, 300 );
    m_ui->historytablewidget->setColumnWidth( 2, 300 );
    setMinimumSize(  m_ui->historytablewidget->columnWidth( 0 )
                  +  m_ui->historytablewidget->columnWidth( 1 )
                  +  m_ui->historytablewidget->columnWidth( 2 )
                  +  m_ui->historytablewidget->columnWidth( 3 ), height() );
    m_ui->historytablewidget->setSortingEnabled(old_sortingenabled);
    return err;
}

void historydialog::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type())
    {
        case QEvent::LanguageChange:
            m_ui->retranslateUi(this);
            break;
        default:
            break;
    }
}

void historydialog::historyWidgetCellChanged( int row, int col )
{
    kDebug( 5970 ) << "Entering function";
    kDebug( 5970 ) << "row =" << row << " col =" << col;
    if ( m_ui->historytablewidget->item( row, 4 ) )
    { // the user did the change, not the program
        if ( col == 1 )
        { // StartDate changed
            kDebug( 5970 ) << "user changed StartDate to" << m_ui->historytablewidget->item( row, col )->text();
            QString uid = m_ui->historytablewidget->item( row, 4 )->text();
            KCalCore::Event::List eventList = mparent->storage()->rawevents();
            for( KCalCore::Event::List::iterator i = eventList.begin(); i != eventList.end(); ++i )
            {
                kDebug(5970) << "row=" << row <<" col=" << col;
                if ( (*i)->uid() == uid )
                {
                    if ( KDateTime::fromString( m_ui->historytablewidget->item( row, col )->text() ).isValid() )
                    {
                        QDateTime datetime = QDateTime::fromString( m_ui->historytablewidget->item( row, col )->text(), "yyyy-MM-dd HH:mm:ss" );
                        KDateTime kdatetime = KDateTime::fromString( datetime.toString( Qt::ISODate ) );
                        (*i)->setDtStart( kdatetime );
                        mparent->reFreshTimes();
                        kDebug(5970) <<"Program SetDtStart to" << m_ui->historytablewidget->item( row, col )->text();
                    }
                    else
                        KMessageBox::information( 0, i18n( "This is not a valid Date/Time." ) );
                }
            }
        }
        if ( col == 2 )
        { // EndDate changed
            kDebug( 5970 ) <<"user changed EndDate to" << m_ui->historytablewidget->item(row,col)->text();
            QString uid = m_ui->historytablewidget->item( row, 4 )->text();
            KCalCore::Event::List eventList = mparent->storage()->rawevents();
            for( KCalCore::Event::List::iterator i = eventList.begin(); i != eventList.end(); ++i)
            {
                kDebug() <<"row=" << row <<" col=" << col;
                if ( (*i)->uid() == uid )
                {
                    if ( KDateTime::fromString( m_ui->historytablewidget->item( row, col )->text() ).isValid() )
                    {
                        QDateTime datetime = QDateTime::fromString( m_ui->historytablewidget->item( row, col )->text(), "yyyy-MM-dd HH:mm:ss" );
                        KDateTime kdatetime = KDateTime::fromString( datetime.toString( Qt::ISODate ) );
                        (*i)->setDtEnd( kdatetime );
                        mparent->reFreshTimes();
                        kDebug(5970) <<"Program SetDtEnd to" << m_ui->historytablewidget->item( row, col )->text();
                    }
                    else
                        KMessageBox::information( 0, i18n( "This is not a valid Date/Time." ) );
                }
            }
        }
        if ( col == 3 )
        { // Comment changed
            kDebug( 5970 ) <<"user changed Comment to" << m_ui->historytablewidget->item(row,col)->text();
            QString uid = m_ui->historytablewidget->item( row, 4 )->text();
            kDebug() <<"uid =" << uid;
            KCalCore::Event::List eventList = mparent->storage()->rawevents();
            for ( KCalCore::Event::List::iterator i = eventList.begin(); i != eventList.end(); ++i )
            {
                kDebug() <<"row=" << row <<" col=" << col;
                if ( (*i)->uid() == uid )
                {
                    (*i)->addComment( m_ui->historytablewidget->item( row, col )->text() );
                    kDebug() <<"added" << m_ui->historytablewidget->item( row, col )->text();
                }
            }
        }
    }
}

QString historydialog::refresh()
{
    QString err;
    while (m_ui->historytablewidget->rowCount()>0)
        m_ui->historytablewidget->removeRow(0);
    listallevents();
    return err;
}

#include "historydialog.moc"

void historydialog::on_deletepushbutton_clicked()
{
    if (m_ui->historytablewidget->item( m_ui->historytablewidget->currentRow(), 4))
    { // if an item is current
        QString uid = m_ui->historytablewidget->item( m_ui->historytablewidget->currentRow(), 4 )->text();
        kDebug() <<"uid =" << uid;
        KCalCore::Event::List eventList = mparent->storage()->rawevents();
        for ( KCalCore::Event::List::iterator i = eventList.begin(); i != eventList.end(); ++i )
        {
            if ( (*i)->uid() == uid )
            {
                kDebug(5970) << "removing uid " << (*i)->uid();
                mparent->storage()->removeEvent((*i)->uid());
                mparent->reFreshTimes();
                this->refresh();
            }
        }
    }
    else KMessageBox::information(this, i18n("Please select a task to delete."));
}

void historydialog::on_okpushbutton_clicked()
{
    m_ui->historytablewidget->setCurrentCell(0,0); // you need to change the cell to store the value
    close();
}
