/*
 * Copyright (C) 2020 by Savoir-faire Linux
 * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
 *
 * 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 3 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, see <https://www.gnu.org/licenses/>.
 */

import QtQuick 2.14
import QtQuick.Controls 2.14
import QtGraphicalEffects 1.12
import net.jami.Models 1.0

import "../../commoncomponents"

import "../../commoncomponents/js/contextmenugenerator.js" as ContextMenuGenerator

Item {
    id: root

    property string responsibleAccountId: ""
    property string responsibleConvUid: ""
    property int contactType: Profile.Type.INVALID

    function openMenu(){
        ContextMenuGenerator.addMenuItem(qsTr("Start video call"),
                                         "qrc:/images/icons/ic_video_call_24px.svg",
                                         function (){
                                             ConversationsAdapter.selectConversation(
                                                         responsibleAccountId,
                                                         responsibleConvUid, false)
                                             CallAdapter.placeCall()
                                         })
        ContextMenuGenerator.addMenuItem(qsTr("Start audio call"),
                                         "qrc:/images/icons/ic_phone_24px.svg",
                                         function (){
                                             ConversationsAdapter.selectConversation(
                                                         responsibleAccountId,
                                                         responsibleConvUid, false)
                                             CallAdapter.placeAudioOnlyCall()
                                         })
        ContextMenuGenerator.addMenuItem(qsTr("Clear conversation"),
                                         "qrc:/images/icons/ic_clear_24px.svg",
                                         function (){
                                             ClientWrapper.utilsAdaptor.clearConversationHistory(
                                                         responsibleAccountId,
                                                         responsibleConvUid)
                                         })

        if (contactType === Profile.Type.RING || contactType === Profile.Type.SIP) {
            ContextMenuGenerator.addMenuItem(qsTr("Remove contact"),
                                             "qrc:/images/icons/round-remove_circle-24px.svg",
                                             function (){
                                                 ClientWrapper.utilsAdaptor.removeConversation(
                                                             responsibleAccountId,
                                                             responsibleConvUid)
                                             })
        }

        if (contactType === Profile.Type.RING || contactType === Profile.Type.PENDING) {
            ContextMenuGenerator.addMenuSeparator()

            if (contactType === Profile.Type.PENDING) {
                ContextMenuGenerator.addMenuItem(qsTr("Accept request"),
                                                 "qrc:/images/icons/person_add-24px.svg",
                                                 function (){
                                                     MessagesAdapter.acceptInvitation(
                                                                 responsibleConvUid)
                                                 })
                ContextMenuGenerator.addMenuItem(qsTr("Decline request"),
                                                 "qrc:/images/icons/round-close-24px.svg",
                                                 function (){
                                                     MessagesAdapter.refuseInvitation(
                                                                 responsibleConvUid)
                                                 })
            }
            ContextMenuGenerator.addMenuItem(qsTr("Block contact"),
                                             "qrc:/images/icons/ic_block_24px.svg",
                                             function (){
                                                 MessagesAdapter.blockConversation(
                                                             responsibleConvUid)
                                             })

            ContextMenuGenerator.addMenuSeparator()
            ContextMenuGenerator.addMenuItem(qsTr("Profile"),
                                             "qrc:/images/icons/person-24px.svg",
                                             function (){
                                                 userProfile.open()
                                             })
        }

        root.height = ContextMenuGenerator.getMenu().height
        root.width = ContextMenuGenerator.getMenu().width
        ContextMenuGenerator.getMenu().open()
    }

    Component.onCompleted: {
        ContextMenuGenerator.createBaseContextMenuObjects(root)
    }
}
