from DateTime import DateTime
from zope.interface import implements

from Products.CMFCore.utils import getToolByName
from Products.CMFPlone import utils
from Products.CMFPlone.browser.interfaces import ICalendarPortlet
# don't use the standard _ for PMF here as we don't want the extraction tools
# to pick this up
from Products.CMFPlone import PloneMessageFactory

class CalendarPortlet(utils.BrowserView):
    implements(ICalendarPortlet)

    def __init__(self, context, request):
        self.context = [context]
        self.request = request
        self.yearmonth = self.getYearAndMonthToDisplay()
        self.DateTime = DateTime
        self.current = DateTime()
        self.current_day = self.current.day()
        self.nextYearMax = self.current + 365
        self.prevYearMin = self.current - 365
        self.year = self.yearmonth[0]
        self.month = self.yearmonth[1]
        self.prevMonthTime = self.getPreviousMonth(self.month, self.year)
        self.nextMonthTime = self.getNextMonth(self.month, self.year)
        calendar = getToolByName(context, 'portal_calendar')
        self.weeks = calendar.getEventsForCalendar(self.month, self.year)
        self.daynumbers = calendar.getDayNumbers()
        self._translation_service = getToolByName(context, 'translation_service')
        self.showStates = calendar.getCalendarStates()
        self.showPrevMonth = self.yearmonth > (self.prevYearMin.year(), self.prevYearMin.month())
        self.showNextMonth = self.yearmonth < (self.nextYearMax.year(), self.nextYearMax.month())

    def getYearAndMonthToDisplay(self):
        """ from skins/plone_scripts/getYearAndMonthToDisplay.py """

        current = DateTime()
        context = utils.context(self)
        request = self.request
        session = None

        # First priority goes to the data in the REQUEST
        year = request.get('year', None)
        month = request.get('month', None)

        # Next get the data from the SESSION
        if context.portal_calendar.getUseSession():
            session = request.get('SESSION', None)
            if session:
                if not year:
                    year = session.get('calendar_year', None)
                if not month:
                    month = session.get('calendar_month', None)

        # Last resort to today
        if not year:
            year = current.year()
        if not month:
            month = current.month()

        year, month = int(year), int(month)

        # Store the results in the session for next time
        if session:
            session.set('calendar_year', year)
            session.set('calendar_month', month)

        # Finally return the results
        return year, month

    def getPreviousMonth(self, month, year):

        month=int(month)
        year=int(year)

        if month==0 or month==1:
            month, year = 12, year - 1
        else:
            month-=1

        return DateTime(year, month, 1)

    def getNextMonth(self, month, year):

        month=int(month)
        year=int(year)

        if month==12:
            month, year = 1, year + 1
        else:
            month+=1

        return DateTime(year, month, 1)

    def getWeekdays(self):
        """Returns a list of Messages for the weekday names."""

        weekdays = []
        # list of ordered weekdays as numbers
        for day in self.daynumbers:
            msgid   = self._translation_service.day_msgid(day, format='s')
            english = self._translation_service.weekday_english(day, format='a')
            weekdays.append(PloneMessageFactory(msgid, default=english))

        return weekdays

    def getEnglishMonthName(self):
        """Returns the current English month name."""
        return self._translation_service.month_english(self.month)

    def getMonthName(self):
        """Returns the current month name as a Message."""
        msgid   = self._translation_service.month_msgid(self.month)
        english = self._translation_service.month_english(self.month)
        return PloneMessageFactory(msgid, default=english)

    def isToday(self, day):
        """Returns True if the given day and the current month and year equals
           today, otherwise False.
        """
        return self.current_day==day and self.current.month()==self.month and \
               self.current.year()==self.year

