import DesignSystem
import Env
import Models
import NetworkClient
import SwiftUI

@MainActor
public struct FiltersListView: View {
  @Environment(\.dismiss) private var dismiss

  @Environment(Theme.self) private var theme
  @Environment(CurrentAccount.self) private var account
  @Environment(MastodonClient.self) private var client

  @State private var isLoading: Bool = true
  @State private var filters: [ServerFilter] = []

  public init() {}

  public var body: some View {
    NavigationStack {
      Form {
        if !isLoading, filters.isEmpty {
          EmptyView()
        } else {
          Section {
            if isLoading, filters.isEmpty {
              ProgressView()
            } else {
              ForEach(filters) { filter in
                NavigationLink(destination: EditFilterView(filter: filter)) {
                  VStack(alignment: .leading) {
                    Text(filter.title)
                      .font(.scaledSubheadline)
                    Text("\(filter.context.map(\.name).joined(separator: ", "))")
                      .font(.scaledBody)
                      .foregroundStyle(.secondary)
                    if filter.hasExpiry() {
                      if filter.isExpired() {
                        Text("filter.expired")
                          .font(.footnote)
                          .foregroundStyle(.secondary)
                      } else {
                        Text("filter.expiry-\(filter.expiresAt!.relativeFormatted)")
                          .font(.footnote)
                          .foregroundStyle(.secondary)
                      }
                    }
                  }
                }
              }
              .onDelete { indexes in
                deleteFilter(client, indexes: indexes)
              }
            }
          }
          #if !os(visionOS)
            .listRowBackground(theme.primaryBackgroundColor)
          #endif
        }

        Section {
          NavigationLink(destination: EditFilterView(filter: nil)) {
            Label("filter.new", systemImage: "plus")
          }
        }
        #if !os(visionOS)
          .listRowBackground(theme.primaryBackgroundColor)
        #endif
      }
      .toolbar {
        toolbarContent
      }
      .navigationTitle("filter.filters")
      .navigationBarTitleDisplayMode(.inline)
      #if !os(visionOS)
        .scrollContentBackground(.hidden)
        .background(theme.secondaryBackgroundColor)
      #endif
      .task {
        do {
          isLoading = true
          filters = try await client.get(endpoint: ServerFilters.filters, forceVersion: .v2)
          isLoading = false
        } catch {
          isLoading = false
        }
      }
    }
  }

  private func deleteFilter(_ client: MastodonClient, indexes: IndexSet) {
    if let index = indexes.first {
      Task {
        do {
          let response = try await client.delete(
            endpoint: ServerFilters.filter(id: filters[index].id),
            forceVersion: .v2)
          if response?.statusCode == 200 {
            filters.remove(at: index)
          }
        } catch {}
      }
    }
  }

  @ToolbarContentBuilder
  private var toolbarContent: some ToolbarContent {
    ToolbarItem(placement: .navigationBarTrailing) {
      Button {
        dismiss()
      } label: {
        Text("action.done").bold()
      }
    }
  }
}
