import SwiftUI
import SFSafeSymbols

struct NotificationSheet: View {

    @EnvironmentObject
    private var content: Content

    @EnvironmentObject
    private var notifications: NotificationSender

    @Environment(\.dismiss)
    private var dismiss

    @State
    private var englishTitle = ""

    @State
    private var englishMessage = ""

    @State
    private var germanTitle = ""

    @State
    private var germanMessage = ""

    private var uploadSymbol: SFSymbol {
        if notifications.isTransmittingToRemote {
            return .squareAndArrowUpBadgeClock
        }
        if !notifications.lastPushWasSuccessful {
            return .squareAndArrowUpTrianglebadgeExclamationmark
        }
        return .squareAndArrowUp
    }

    var header: String {
        let user = content.settings.general.remoteUserForUpload
        let port = content.settings.general.remotePortForUpload
        let url = content.settings.general.remotePathForUpload.withHttpPrefixRemoved
        let path = content.settings.general.remotePathForUpload
        return "\(user)@\(url):\(port)/\(path)"
    }

    var isIncomplete: Bool {
        englishTitle.isEmpty || germanTitle.isEmpty || englishMessage.isEmpty || germanMessage.isEmpty
    }

    var body: some View {
        VStack {
            HStack {
                Text("Send a notification to subscribers")
                    .font(.headline)
                Spacer()
                Button("Close", action: { dismiss() })
            }
            StringPropertyView(
                title: "English title",
                text: $englishTitle,
                footer: "The title for devices using the english language")

            StringPropertyView(
                title: "English message",
                text: $englishMessage,
                footer: "The message for devices using the english language")

            StringPropertyView(
                title: "German title",
                text: $germanTitle,
                footer: "The title for devices using the german language")

            StringPropertyView(
                title: "German message",
                text: $germanMessage,
                footer: "The message for devices using the german language")

            Button("Send", action: send)
                .disabled(notifications.isTransmittingToRemote || isIncomplete)
        }
        .padding()
        .frame(minWidth: 300, idealWidth: 400, idealHeight: 500)
    }

    private func send() {
        guard let accessToken = content.settings.general.pushNotificationAccessToken,
              let url = content.settings.general.urlForPushNotification else {
            return
        }


        let english = WebNotification(title: englishTitle, body: englishMessage)
        let german = WebNotification(title: germanTitle, body: germanMessage)

        let notifications: [String : WebNotification] = [
            "en": english,
            "de": german
        ]

        let request = NotificationRequest.init(
            accessToken: accessToken,
            notifications: notifications)

        self.notifications.send(url: url, request: request)
    }
}
