import QtQuick 2.13

import StatusQ.Controls 0.1

import utils 1.0
import shared 1.0
import shared.views 1.0
import shared.popups 1.0
import shared.panels 1.0
import shared.views.chat 1.0

import "../controls"
import "../panels"
import "../popups"

Item {
    id: root
    width: parent.width
    // Setting a height of 0 breaks the layout for when it comes back visible
    // The Item never goes back to actually have a height or width
    height: visible ? messageNotificationContent.height : 0.01
    visible: {
        if (hideReadNotifications && model.read) {
            return false
        }
        return acCurrentActivityCategory === ActivityCenterPopup.ActivityCategory.All ||
                (model.notificationType === Constants.activityCenterNotificationTypeMention && acCurrentActivityCategory === ActivityCenterPopup.ActivityCategory.Mentions) ||
                (model.notificationType === Constants.activityCenterNotificationTypeOneToOne && acCurrentActivityCategory === ActivityCenterPopup.ActivityCategory.ContactRequests) ||
                (model.notificationType === Constants.activityCenterNotificationTypeReply && acCurrentActivityCategory === ActivityCenterPopup.ActivityCategory.Replies)
    }

    property var store
    property int acCurrentActivityCategory
    property var chatSectionModule
    property int previousNotificationIndex
    property bool hideReadNotifications
    property string previousNotificationTimestamp
    // Not Refactored Yet
    property int communityIndex: -1 //root.store.chatsModelInst.communities.joinedCommunities.getCommunityIndex(model.message.communityId)
    property var messageContextMenu
    function openProfile() {
        Global.openProfilePopup(model.author)
    }
    signal activityCenterClose()

    function reevaluateItemBadge() {
        let details = root.store.getBadgeDetails(model.sectionId, model.chatId)
        badge.isCommunity = (details.sType === "community")
        badge.name = details.cName
        badge.channelName = details.cName
        badge.communityName = details.sName
        badge.communityColor = details.sColor
        badge.communityThumbnailImage = details.sImage
    }

    Component {
        id: markReadBtnComponent
        StatusFlatRoundButton {
            id: markReadBtn
            width: 32
            height: 32
            icon.width: 24
            icon.height: 24
            icon.source: Style.svg("check-activity")
            icon.color: model.read ? icon.disabledColor : "transparent"
            color: "transparent"
            tooltip.text: !model.read ?
                qsTr("Mark as Read") :
                qsTr("Mark as Unread")
            tooltip.orientation: StatusToolTip.Orientation.Left
            tooltip.x: -tooltip.width - Style.current.padding
            tooltip.y: markReadBtn.height / 2 - height / 2 + 4
            onClicked: {
                if (!model.read) {
                    return root.store.activityCenterModuleInst.markActivityCenterNotificationRead(model.id, model.message.communityId, model.chatId, model.notificationType)
                }
                return root.store.activityCenterModuleInst.markActivityCenterNotificationUnread(model.id, model.message.communityId, model.message.chatId, model.notificationType)
            }
        }
    }


    Component {
        id: acceptRejectComponent
        AcceptRejectOptionsButtonsPanel {
            id: buttons
            onAcceptClicked: {
                // Not Refactored Yet
//                const setActiveChannel = root.store.chatsModelInst.channelView.setActiveChannel
//                const chatId = model.message.chatId
//                const messageId = model.message.messageId
                root.store.activityCenterModuleInst.acceptActivityCenterNotification(model.id)
//                root.store.chatsModelInst.activityNotificationList.acceptActivityCenterNotification(model.id)
//                setActiveChannel(chatId)
//                positionAtMessage(messageId)
            }
            onDeclineClicked: root.store.activityCenterModuleInst.dismissActivityCenterNotification(model.id)
            onProfileClicked: root.openProfile()
            onBlockClicked: {
                // Not Refactored Yet
//                const pk = model.author
//                blockContactConfirmationDialog.contactName = chatsModel.userNameOrAlias(pk)
//                blockContactConfirmationDialog.contactAddress = pk
//                blockContactConfirmationDialog.open()
            }

            BlockContactConfirmationDialog {
                id: blockContactConfirmationDialog
                onBlockButtonClicked: {
                    // Not Refactored Yet
//                    root.store.profileModuleInst.blockContact(blockContactConfirmationDialog.contactAddress)
                    root.store.activityCenterModuleInst.dismissActivityCenterNotification(model.id)
                    blockContactConfirmationDialog.close()
                }
            }
        }
    }

    Item {
        id: messageNotificationContent
        width: parent.width
        height: childrenRect.height
        MessageView {
            id: notificationMessage
            anchors.right: undefined
            rootStore: root.store
            messageStore: root.store.messageStore
            messageId: model.id
            senderDisplayName: model.message.senderDisplayName
            messageText: model.message.messageText
            responseToMessageWithId: model.message.responseToMessageWithId
            senderId: model.message.senderId
            senderOptionalName: model.message.senderOptionalName
            senderIsEnsVerified: model.message.senderEnsVerified
            senderIcon: model.message.senderIcon
            amISender: model.message.amISender
            messageImage: model.message.messageImage
            messageTimestamp: model.timestamp
            messageOutgoingStatus: model.message.outgoingStatus
            messageContentType: model.message.contentType
            senderTrustStatus: model.message.senderTrustStatus
            activityCenterMessage: true
            activityCenterMessageRead: model.read
            onImageClicked: Global.openImagePopup(image, root.messageContextMenu)
            scrollToBottom: null
            messageClickHandler: {
                if (isProfileClick) {
                    return Global.openProfilePopup(model.message.senderId);
                }

                activityCenterClose()
                root.store.activityCenterModuleInst.switchTo(model.sectionId, model.chatId, model.id)
            }
            prevMessageIndex: root.previousNotificationIndex
            prevMsgTimestamp: root.previousNotificationTimestamp
        }

        Rectangle {
            id: bottomBackdrop
            visible: badge.visible
            anchors.top: notificationMessage.bottom
            anchors.bottom: badge.bottom
            anchors.bottomMargin: visible ? -Style.current.smallPadding : 0
            width: parent.width
            color: model.read ? Style.current.transparent : Utils.setColorAlpha(Style.current.blue, 0.1)
        }

        Loader {
            active: true
            anchors.right: parent.right
            anchors.rightMargin: 12
            anchors.bottom: notificationMessage.bottom
            anchors.bottomMargin: 14
            z: 52

            sourceComponent: {
                if (model.notificationType === Constants.activityCenterNotificationTypeOneToOne) {
                    return acceptRejectComponent
                }
                return markReadBtnComponent
            }
        }

        ActivityChannelBadgePanel {
            id: badge
            anchors.top: notificationMessage.bottom
            anchors.left: parent.left
            anchors.leftMargin: 61 // TODO find a way to align with the text of the message
            visible: model.notificationType !== Constants.activityCenterNotificationTypeOneToOne
            notificationType: model.notificationType
            profileImage: realChatType === Constants.chatType.oneToOne ? Global.getProfileImage(chatId) || ""  : ""
            repliedMessageContent: model.repliedMessage.messageText
            repliedMessageId: model.message.responseToMessageWithId

            onCommunityNameClicked: {
                root.store.activityCenterModuleInst.switchTo(model.sectionId, "", "")
                activityCenterClose();
            }
            onChannelNameClicked: {
                root.store.activityCenterModuleInst.switchTo(model.sectionId, model.chatId, "")
                activityCenterClose();
            }
        }
    }
}