__filename__ = "webapp_timeline.py"
__author__ = "Bob Mottram"
__license__ = "AGPL3+"
__version__ = "1.1.0"
__maintainer__ = "Bob Mottram"
__email__ = "bob@freedombone.net"
__status__ = "Production"
import os
from datetime import datetime
import time
from utils import removeIdEnding
from follow import followerApprovalActive
from person import isPersonSnoozed
from happening import todaysEventsCheck
from happening import thisWeeksEventsCheck
from webapp_utils import getIconsWebPath
from webapp_utils import htmlPostSeparator
from webapp_utils import getBannerFile
from webapp_utils import htmlHeaderWithExternalStyle
from webapp_utils import htmlFooter
from webapp_utils import sharesTimelineJson
from webapp_post import preparePostFromHtmlCache
from webapp_post import individualPostAsHtml
from webapp_column_left import getLeftColumnContent
from webapp_column_right import getRightColumnContent
from posts import isModerator
from posts import isEditor
def htmlTimeline(cssCache: {}, defaultTimeline: str,
                 recentPostsCache: {}, maxRecentPosts: int,
                 translate: {}, pageNumber: int,
                 itemsPerPage: int, session, baseDir: str,
                 wfRequest: {}, personCache: {},
                 nickname: str, domain: str, port: int, timelineJson: {},
                 boxName: str, allowDeletion: bool,
                 httpPrefix: str, projectVersion: str,
                 manuallyApproveFollowers: bool,
                 minimal: bool,
                 YTReplacementDomain: str,
                 showPublishedDateOnly: bool,
                 newswire: {}, moderator: bool,
                 editor: bool,
                 positiveVoting: bool,
                 showPublishAsIcon: bool,
                 fullWidthTimelineButtonHeader: bool,
                 iconsAsButtons: bool,
                 rssIconAtTop: bool,
                 publishButtonAtTop: bool,
                 authorized: bool) -> str:
    """Show the timeline as html
    """
    timelineStartTime = time.time()
    accountDir = baseDir + '/accounts/' + nickname + '@' + domain
    # should the calendar icon be highlighted?
    newCalendarEvent = False
    calendarImage = 'calendar.png'
    calendarPath = '/calendar'
    calendarFile = accountDir + '/.newCalendar'
    if os.path.isfile(calendarFile):
        newCalendarEvent = True
        calendarImage = 'calendar_notify.png'
        with open(calendarFile, 'r') as calfile:
            calendarPath = calfile.read().replace('##sent##', '')
            calendarPath = calendarPath.replace('\n', '').replace('\r', '')
    # should the DM button be highlighted?
    newDM = False
    dmFile = accountDir + '/.newDM'
    if os.path.isfile(dmFile):
        newDM = True
        if boxName == 'dm':
            os.remove(dmFile)
    # should the Replies button be highlighted?
    newReply = False
    replyFile = accountDir + '/.newReply'
    if os.path.isfile(replyFile):
        newReply = True
        if boxName == 'tlreplies':
            os.remove(replyFile)
    # should the Shares button be highlighted?
    newShare = False
    newShareFile = accountDir + '/.newShare'
    if os.path.isfile(newShareFile):
        newShare = True
        if boxName == 'tlshares':
            os.remove(newShareFile)
    # should the Moderation/reports button be highlighted?
    newReport = False
    newReportFile = accountDir + '/.newReport'
    if os.path.isfile(newReportFile):
        newReport = True
        if boxName == 'moderation':
            os.remove(newReportFile)
    # directory where icons are found
    # This changes depending upon theme
    iconsPath = getIconsWebPath(baseDir)
    separatorStr = ''
    if boxName != 'tlmedia':
        separatorStr = htmlPostSeparator(baseDir, None)
    # the css filename
    cssFilename = baseDir + '/epicyon-profile.css'
    if os.path.isfile(baseDir + '/epicyon.css'):
        cssFilename = baseDir + '/epicyon.css'
    # filename of the banner shown at the top
    bannerFile, bannerFilename = getBannerFile(baseDir, nickname, domain)
    # benchmark 1
    timeDiff = int((time.time() - timelineStartTime) * 1000)
    if timeDiff > 100:
        print('TIMELINE TIMING ' + boxName + ' 1 = ' + str(timeDiff))
    # is the user a moderator?
    if not moderator:
        moderator = isModerator(baseDir, nickname)
    # is the user a site editor?
    if not editor:
        editor = isEditor(baseDir, nickname)
    # benchmark 2
    timeDiff = int((time.time() - timelineStartTime) * 1000)
    if timeDiff > 100:
        print('TIMELINE TIMING ' + boxName + ' 2 = ' + str(timeDiff))
    # the appearance of buttons - highlighted or not
    inboxButton = 'button'
    blogsButton = 'button'
    newsButton = 'button'
    dmButton = 'button'
    if newDM:
        dmButton = 'buttonhighlighted'
    repliesButton = 'button'
    if newReply:
        repliesButton = 'buttonhighlighted'
    mediaButton = 'button'
    bookmarksButton = 'button'
    eventsButton = 'button'
    sentButton = 'button'
    sharesButton = 'button'
    if newShare:
        sharesButton = 'buttonhighlighted'
    moderationButton = 'button'
    if newReport:
        moderationButton = 'buttonhighlighted'
    if boxName == 'inbox':
        inboxButton = 'buttonselected'
    elif boxName == 'tlblogs':
        blogsButton = 'buttonselected'
    elif boxName == 'tlnews':
        newsButton = 'buttonselected'
    elif boxName == 'dm':
        dmButton = 'buttonselected'
        if newDM:
            dmButton = 'buttonselectedhighlighted'
    elif boxName == 'tlreplies':
        repliesButton = 'buttonselected'
        if newReply:
            repliesButton = 'buttonselectedhighlighted'
    elif boxName == 'tlmedia':
        mediaButton = 'buttonselected'
    elif boxName == 'outbox':
        sentButton = 'buttonselected'
    elif boxName == 'moderation':
        moderationButton = 'buttonselected'
        if newReport:
            moderationButton = 'buttonselectedhighlighted'
    elif boxName == 'tlshares':
        sharesButton = 'buttonselected'
        if newShare:
            sharesButton = 'buttonselectedhighlighted'
    elif boxName == 'tlbookmarks' or boxName == 'bookmarks':
        bookmarksButton = 'buttonselected'
    elif boxName == 'tlevents':
        eventsButton = 'buttonselected'
    # get the full domain, including any port number
    fullDomain = domain
    if port != 80 and port != 443:
        if ':' not in domain:
            fullDomain = domain + ':' + str(port)
    usersPath = '/users/' + nickname
    actor = httpPrefix + '://' + fullDomain + usersPath
    showIndividualPostIcons = True
    # show an icon for new follow approvals
    followApprovals = ''
    followRequestsFilename = \
        baseDir + '/accounts/' + \
        nickname + '@' + domain + '/followrequests.txt'
    if os.path.isfile(followRequestsFilename):
        with open(followRequestsFilename, 'r') as f:
            for line in f:
                if len(line) > 0:
                    # show follow approvals icon
                    followApprovals = \
                        '' + \
                        '![' + translate['Approve follow requests'] + \
                        ' ' + \
                        translate['Approve follow requests'] + \
                        '](/' + iconsPath + '/person.png) \n'
                    break
    # benchmark 3
    timeDiff = int((time.time() - timelineStartTime) * 1000)
    if timeDiff > 100:
        print('TIMELINE TIMING ' + boxName + ' 3 = ' + str(timeDiff))
    # moderation / reports button
    moderationButtonStr = ''
    if moderator and not minimal:
        moderationButtonStr = \
            ''
    # shares, bookmarks and events buttons
    sharesButtonStr = ''
    bookmarksButtonStr = ''
    eventsButtonStr = ''
    if not minimal:
        sharesButtonStr = \
            ''
        bookmarksButtonStr = \
            ''
        eventsButtonStr = \
            ''
    tlStr = htmlHeaderWithExternalStyle(cssFilename)
    # benchmark 4
    timeDiff = int((time.time() - timelineStartTime) * 1000)
    if timeDiff > 100:
        print('TIMELINE TIMING ' + boxName + ' 4 = ' + str(timeDiff))
    # if this is a news instance and we are viewing the news timeline
    newsHeader = False
    if defaultTimeline == 'tlnews' and boxName == 'tlnews':
        newsHeader = True
    newPostButtonStr = ''
    # start of headericons div
    if not newsHeader:
        if not iconsAsButtons:
            newPostButtonStr += '
\n'
                    break
    # benchmark 3
    timeDiff = int((time.time() - timelineStartTime) * 1000)
    if timeDiff > 100:
        print('TIMELINE TIMING ' + boxName + ' 3 = ' + str(timeDiff))
    # moderation / reports button
    moderationButtonStr = ''
    if moderator and not minimal:
        moderationButtonStr = \
            ''
    # shares, bookmarks and events buttons
    sharesButtonStr = ''
    bookmarksButtonStr = ''
    eventsButtonStr = ''
    if not minimal:
        sharesButtonStr = \
            ''
        bookmarksButtonStr = \
            ''
        eventsButtonStr = \
            ''
    tlStr = htmlHeaderWithExternalStyle(cssFilename)
    # benchmark 4
    timeDiff = int((time.time() - timelineStartTime) * 1000)
    if timeDiff > 100:
        print('TIMELINE TIMING ' + boxName + ' 4 = ' + str(timeDiff))
    # if this is a news instance and we are viewing the news timeline
    newsHeader = False
    if defaultTimeline == 'tlnews' and boxName == 'tlnews':
        newsHeader = True
    newPostButtonStr = ''
    # start of headericons div
    if not newsHeader:
        if not iconsAsButtons:
            newPostButtonStr += '
![' + \
                translate['Create a new DM'] + \
                ' | ' + translate['Create a new DM'] + \
                '](/' + \
                iconsPath + '/newpost.png) \n'
        else:
            newPostButtonStr += \
                '' + \
                ''
    elif boxName == 'tlblogs' or boxName == 'tlnews':
        if not iconsAsButtons:
            newPostButtonStr += \
                '
\n'
        else:
            newPostButtonStr += \
                '' + \
                ''
    elif boxName == 'tlblogs' or boxName == 'tlnews':
        if not iconsAsButtons:
            newPostButtonStr += \
                '![' + \
                translate['Create a new post'] + ' | ' + \
                translate['Create a new post'] + \
                '](/' + \
                iconsPath + '/newpost.png) \n'
        else:
            newPostButtonStr += \
                '' + \
                ''
    elif boxName == 'tlevents':
        if not iconsAsButtons:
            newPostButtonStr += \
                '
\n'
        else:
            newPostButtonStr += \
                '' + \
                ''
    elif boxName == 'tlevents':
        if not iconsAsButtons:
            newPostButtonStr += \
                '![' + \
                translate['Create a new event'] + ' | ' + \
                translate['Create a new event'] + \
                '](/' + \
                iconsPath + '/newpost.png) \n'
        else:
            newPostButtonStr += \
                '' + \
                ''
    else:
        if not manuallyApproveFollowers:
            if not iconsAsButtons:
                newPostButtonStr += \
                    '
\n'
        else:
            newPostButtonStr += \
                '' + \
                ''
    else:
        if not manuallyApproveFollowers:
            if not iconsAsButtons:
                newPostButtonStr += \
                    '![' + \
                    translate['Create a new post'] + ' | ' + \
                    translate['Create a new post'] + \
                    '](/' + \
                    iconsPath + '/newpost.png) \n'
            else:
                newPostButtonStr += \
                    '' + \
                    ''
        else:
            if not iconsAsButtons:
                newPostButtonStr += \
                    '
\n'
            else:
                newPostButtonStr += \
                    '' + \
                    ''
        else:
            if not iconsAsButtons:
                newPostButtonStr += \
                    '![' + \
                    translate['Create a new post'] + \
                    ' | ' + translate['Create a new post'] + \
                    '](/' + \
                    iconsPath + '/newpost.png) \n'
            else:
                newPostButtonStr += \
                    '' + \
                    ''
    # This creates a link to the profile page when viewed
    # in lynx, but should be invisible in a graphical web browser
    tlStr += \
        '\n'
    # banner and row of buttons
    tlStr += \
        '\n'
    tlStr += '
\n'
            else:
                newPostButtonStr += \
                    '' + \
                    ''
    # This creates a link to the profile page when viewed
    # in lynx, but should be invisible in a graphical web browser
    tlStr += \
        '\n'
    # banner and row of buttons
    tlStr += \
        '\n'
    tlStr += '' + item['summary'] + '
\n' profileStr += \ '' + translate['Type'] + ': ' + item['itemType'] + ' ' profileStr += \ '' + translate['Category'] + ': ' + item['category'] + ' ' profileStr += \ '' + translate['Location'] + ': ' + item['location'] + '
\n' if showContact: contactActor = item['actor'] profileStr += \ '![' + translate['Page up'] + \
            ' ' + translate['Page up'] + '](/' + \
            iconsPath + '/pageup.png) \n' + \
            '
\n' + \
            '  ![' + translate['Page down'] + \
            ' ' + translate['Page down'] + '](/' + \
            iconsPath + '/pagedown.png) \n' + \
            '
\n' + \
            '  ![' + \
                translate['Search and follow'] + ' | ' + \
                translate['Search and follow'] + \
                '](/' + \
                iconsPath + '/search.png) '
        else:
            # the search button
            tlStr += \
                ''
    # benchmark 5
    timeDiff = int((time.time() - timelineStartTime) * 1000)
    if timeDiff > 100:
        print('TIMELINE TIMING ' + boxName + ' 5 = ' + str(timeDiff))
    # the calendar button
    if not isFeaturesTimeline:
        calendarAltText = translate['Calendar']
        if newCalendarEvent:
            # indicate that the calendar icon is highlighted
            calendarAltText = '*' + calendarAltText + '*'
        if not iconsAsButtons:
            tlStr += \
                '
'
        else:
            # the search button
            tlStr += \
                ''
    # benchmark 5
    timeDiff = int((time.time() - timelineStartTime) * 1000)
    if timeDiff > 100:
        print('TIMELINE TIMING ' + boxName + ' 5 = ' + str(timeDiff))
    # the calendar button
    if not isFeaturesTimeline:
        calendarAltText = translate['Calendar']
        if newCalendarEvent:
            # indicate that the calendar icon is highlighted
            calendarAltText = '*' + calendarAltText + '*'
        if not iconsAsButtons:
            tlStr += \
                '      ![' + translate['Show/Hide Buttons'] + \
                ' | ' + translate['Show/Hide Buttons'] + \
                '](/' + iconsPath + \
                '/showhide.png) \n'
        else:
            tlStr += \
                ''
    if newsHeader:
        tlStr += \
            '' + \
            ''
    # the newswire button to show right column links
    if not iconsAsButtons:
        tlStr += \
            '' + \
            '
\n'
        else:
            tlStr += \
                ''
    if newsHeader:
        tlStr += \
            '' + \
            ''
    # the newswire button to show right column links
    if not iconsAsButtons:
        tlStr += \
            '' + \
            '![' + translate['News'] + \
            ' | ' + translate['News'] + \
            '](/' + iconsPath + \
            '/newswire.png) '
    else:
        # NOTE: deliberately no \n at end of line
        tlStr += \
            ''
    # the links button to show left column links
    if not iconsAsButtons:
        tlStr += \
            '' + \
            '
'
    else:
        # NOTE: deliberately no \n at end of line
        tlStr += \
            ''
    # the links button to show left column links
    if not iconsAsButtons:
        tlStr += \
            '' + \
            '![' + translate['Edit Links'] + \
            ' | ' + translate['Edit Links'] + \
            '](/' + iconsPath + \
            '/links.png) '
        # end of headericons div
        tlStr += '
'
        # end of headericons div
        tlStr += '