import AppAccount
import DesignSystem
import Env
import Models
import Network
import NukeUI
import SwiftUI
import UserNotifications

@MainActor
struct PushNotificationsView: View {
  @Environment(Theme.self) private var theme
  @Environment(AppAccountsManager.self) private var appAccountsManager
  @Environment(PushNotificationsService.self) private var pushNotifications

  @State public var subscription: PushNotificationSubscriptionSettings

  var body: some View {
    Form {
      Section {
        Toggle(isOn: .init(get: {
          subscription.isEnabled
        }, set: { newValue in
          subscription.isEnabled = newValue
          if newValue {
            updateSubscription()
          } else {
            deleteSubscription()
          }
        })) {
          Text("settings.push.main-toggle")
        }
      } footer: {
        Text("settings.push.main-toggle.description")
      }
      #if !os(visionOS)
      .listRowBackground(theme.primaryBackgroundColor)
      #endif

      if subscription.isEnabled {
        Section {
          Toggle(isOn: .init(get: {
            subscription.isMentionNotificationEnabled
          }, set: { newValue in
            subscription.isMentionNotificationEnabled = newValue
            updateSubscription()
          })) {
            Label("settings.push.mentions", systemImage: "at")
          }
          Toggle(isOn: .init(get: {
            subscription.isFollowNotificationEnabled
          }, set: { newValue in
            subscription.isFollowNotificationEnabled = newValue
            updateSubscription()
          })) {
            Label("settings.push.follows", systemImage: "person.badge.plus")
          }
          Toggle(isOn: .init(get: {
            subscription.isFavoriteNotificationEnabled
          }, set: { newValue in
            subscription.isFavoriteNotificationEnabled = newValue
            updateSubscription()
          })) {
            Label("settings.push.favorites", systemImage: "star")
          }
          Toggle(isOn: .init(get: {
            subscription.isReblogNotificationEnabled
          }, set: { newValue in
            subscription.isReblogNotificationEnabled = newValue
            updateSubscription()
          })) {
            Label("settings.push.boosts", image: "Rocket")
          }
          Toggle(isOn: .init(get: {
            subscription.isPollNotificationEnabled
          }, set: { newValue in
            subscription.isPollNotificationEnabled = newValue
            updateSubscription()
          })) {
            Label("settings.push.polls", systemImage: "chart.bar")
          }
          Toggle(isOn: .init(get: {
            subscription.isNewPostsNotificationEnabled
          }, set: { newValue in
            subscription.isNewPostsNotificationEnabled = newValue
            updateSubscription()
          })) {
            Label("settings.push.new-posts", systemImage: "bubble.right")
          }
        }
        #if !os(visionOS)
        .listRowBackground(theme.primaryBackgroundColor)
        #endif
      }

      Section {
        Button("settings.push.duplicate.button.fix") {
          Task {
            await subscription.deleteSubscription()
            await subscription.updateSubscription()
          }
        }
      } header: {
        Text("settings.push.duplicate.title")
      } footer: {
        Text("settings.push.duplicate.footer")
      }
      #if !os(visionOS)
      .listRowBackground(theme.primaryBackgroundColor)
      #endif
    }
    .navigationTitle("settings.push.navigation-title")
    #if !os(visionOS)
    .scrollContentBackground(.hidden)
    .background(theme.secondaryBackgroundColor)
    #endif
    .task {
      await subscription.fetchSubscription()
    }
  }

  private func updateSubscription() {
    Task {
      await subscription.updateSubscription()
    }
  }

  private func deleteSubscription() {
    Task {
      await subscription.deleteSubscription()
    }
  }
}
