import SwiftUI
import UIKit

struct TwoFactorView: View {
    let challengeId: String
    let message: String?

    @State private var code = ""
    @State private var status = ""
    @State private var isLoading = false

    private var deviceName: String {
        "NotizViewer-\(UIDevice.current.model)"
    }

    var body: some View {
        ScrollView {
            VStack(alignment: .leading, spacing: 18) {
                Text("Two-factor verification")
                    .font(.system(size: 26, weight: .bold, design: .rounded))
                    .foregroundStyle(ViewerTheme.ink)
                Text(message ?? "Enter the code sent to your email.")
                    .foregroundStyle(ViewerTheme.muted)

                ViewerCard {
                    VStack(alignment: .leading, spacing: 12) {
                        TextField("Verification code", text: $code)
                            .keyboardType(.numberPad)
                            .padding(12)
                            .background(RoundedRectangle(cornerRadius: 12).fill(Color.black.opacity(0.03)))
                        Button {
                            Task { await verify() }
                        } label: {
                            Text(isLoading ? "Verifying…" : "Verify")
                                .frame(maxWidth: .infinity)
                        }
                        .buttonStyle(.borderedProminent)
                        .tint(ViewerTheme.accent)
                        .disabled(isLoading)

                        Button("Resend code") {
                            Task { await resend() }
                        }
                        .buttonStyle(.bordered)
                        .tint(ViewerTheme.accent)
                        .frame(maxWidth: .infinity)
                    }
                }

                if !status.isEmpty {
                    Text(status)
                        .font(.footnote)
                        .foregroundStyle(.red)
                }
            }
            .padding(20)
        }
        .background(ViewerTheme.pageBackground.ignoresSafeArea())
    }

    private func verify() async {
        let trimmed = code.trimmingCharacters(in: .whitespaces)
        guard !trimmed.isEmpty else { status = "Enter the code."; return }
        isLoading = true
        defer { isLoading = false }
        do {
            let response = try await APIClient.shared.verifyTwoFactor(
                TwoFactorVerifyRequest(challenge_id: challengeId, code: trimmed, device_name: deviceName)
            )
            if let token = response.token, let profile = response.profile {
                SecureStore.shared.storeSession(token: token, profile: profile)
            } else {
                status = response.message ?? "Verification failed."
            }
        } catch {
            status = error.localizedDescription
        }
    }

    private func resend() async {
        status = ""
        do {
            try await APIClient.shared.resendTwoFactor(TwoFactorResendRequest(challenge_id: challengeId))
            status = "A new code was sent."
        } catch {
            status = error.localizedDescription
        }
    }
}
