import SwiftUI
import UIKit

struct LoginView: View {
    @EnvironmentObject private var store: SecureStore
    var onTwoFactor: (String, String) -> Void

    @State private var login = ""
    @State private var password = ""
    @State private var companyNumber = ""
    @State private var status = ""
    @State private var isLoading = false

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

    var body: some View {
        ScrollView {
            VStack(alignment: .leading, spacing: 18) {
                Text("Notiz Viewer")
                    .font(.system(size: 30, weight: .bold, design: .rounded))
                    .foregroundStyle(ViewerTheme.accent)
                Text("Sign in with your company account")
                    .foregroundStyle(ViewerTheme.muted)

                ViewerCard {
                    VStack(alignment: .leading, spacing: 12) {
                        TextField("Username or email", text: $login)
                            .textInputAutocapitalization(.never)
                            .autocorrectionDisabled()
                            .padding(12)
                            .background(RoundedRectangle(cornerRadius: 12).fill(Color.black.opacity(0.03)))
                        TextField("Company number", text: $companyNumber)
                            .keyboardType(.numberPad)
                            .textInputAutocapitalization(.never)
                            .autocorrectionDisabled()
                            .padding(12)
                            .background(RoundedRectangle(cornerRadius: 12).fill(Color.black.opacity(0.03)))
                        SecureField("Password", text: $password)
                            .padding(12)
                            .background(RoundedRectangle(cornerRadius: 12).fill(Color.black.opacity(0.03)))
                        Button {
                            Task { await signIn() }
                        } label: {
                            Text(isLoading ? "Signing in…" : "Sign in")
                                .frame(maxWidth: .infinity)
                        }
                        .buttonStyle(.borderedProminent)
                        .tint(ViewerTheme.accent)
                        .disabled(isLoading)
                    }
                }

                if !status.isEmpty {
                    Text(status)
                        .font(.footnote)
                        .foregroundStyle(.red)
                }

                Text("Super Admin accounts cannot sign in to the Viewer app. Use the web dashboard for Super Admin access.")
                    .font(.footnote)
                    .foregroundStyle(ViewerTheme.muted)
            }
            .padding(20)
        }
        .background(ViewerTheme.pageBackground.ignoresSafeArea())
    }

    private func signIn() async {
        let trimmedLogin = login.trimmingCharacters(in: .whitespaces)
        let trimmedNumber = companyNumber.trimmingCharacters(in: .whitespaces)
        guard !trimmedLogin.isEmpty, !password.isEmpty, !trimmedNumber.isEmpty else {
            status = "All fields are required."
            return
        }
        isLoading = true
        status = ""
        defer { isLoading = false }

        do {
            let response = try await APIClient.shared.login(
                LoginRequest(login: trimmedLogin, password: password, company_number: trimmedNumber, device_name: deviceName)
            )
            if response.code == "two_factor_required", let challenge = response.challenge_id {
                onTwoFactor(challenge, response.message ?? "Enter the code sent to your email.")
                return
            }
            if let token = response.token, let profile = response.profile {
                store.storeSession(token: token, profile: profile)
            } else {
                status = response.message ?? "Login failed."
            }
        } catch let error as ViewerError where error.isMaintenance {
            status = error.localizedDescription
        } catch {
            status = error.localizedDescription
        }
    }
}
