/*
    This file is part of libkcal.

    Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>

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

    This library 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
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/

#include <kglobal.h>
#include <klocale.h>
#include <kdebug.h>

#include "event.h"

using namespace KCal;

Event::Event() :
  mHasEndDate( false ), mTransparency( Opaque )
{
}

Event::Event(const Event &e) : Incidence(e)
{
  mDtEnd = e.mDtEnd;
  mHasEndDate = e.mHasEndDate;
  mTransparency = e.mTransparency;
}

Event::~Event()
{
//  kdDebug(5800) << "~Event() " << int( this ) << endl;
}

Event *Event::clone()
{
//  kdDebug(5800) << "Event::clone()" << endl;
  return new Event(*this);
}

Event& Event::operator=( const Event &e )
{
  Incidence::operator=( e );
  mDtEnd = e.mDtEnd;
  mHasEndDate = e.mHasEndDate;
  mTransparency = e.mTransparency;
  return *this;
}

bool Event::operator==( const Event& e2 ) const
{
    return
        static_cast<const Incidence&>(*this) == static_cast<const Incidence&>(e2) &&
        dtEnd() == e2.dtEnd() &&
        hasEndDate() == e2.hasEndDate() &&
        transparency() == e2.transparency();
}



void Event::setDtEnd(const TQDateTime &dtEnd)
{
  if (mReadOnly) return;

  mDtEnd = dtEnd;

  setHasEndDate(true);
  setHasDuration(false);

  updated();
}

TQDateTime Event::dtEnd() const
{
  if (hasEndDate()) return mDtEnd;
  if (hasDuration()) return dtStart().addSecs(duration());

  // It is valid for a VEVENT to be without a DTEND. See RFC2445, Sect4.6.1.
  // Be careful to use Event::dateEnd() as appropriate due to this possibility.
  return dtStart();
}

TQDate Event::dateEnd() const
{
  if ( doesFloat() ) return dtEnd().date();
  else return dtEnd().addSecs(-1).date();
}

TQString Event::dtEndTimeStr() const
{
  return KGlobal::locale()->formatTime(dtEnd().time());
}

TQString Event::dtEndDateStr(bool shortfmt) const
{
  return KGlobal::locale()->formatDate(dtEnd().date(),shortfmt);
}

TQString Event::dtEndStr() const
{
  return KGlobal::locale()->formatDateTime(dtEnd());
}

void Event::setHasEndDate(bool b)
{
  mHasEndDate = b;
}

bool Event::hasEndDate() const
{
  return mHasEndDate;
}

bool Event::isMultiDay() const
{
  // End date is non inclusive, so subtract 1 second...
  TQDateTime start( dtStart() );
  TQDateTime end( dtEnd() );
  if ( ! doesFloat() ) {
    end = end.addSecs(-1);
  }
  bool multi = ( start.date() != end.date() && start <= end );
  return multi;
}

void Event::setTransparency(Event::Transparency transparency)
{
  if (mReadOnly) return;
  mTransparency = transparency;
  updated();
}

Event::Transparency Event::transparency() const
{
  return mTransparency;
}

void Event::setDuration(int seconds)
{
  setHasEndDate(false);
  Incidence::setDuration(seconds);
}