//
//  DataExportView.swift
//  lichunWebsocket
//
//  Created for BaoLife Phase 7 - GDPR Compliance
//  Data export functionality for user data portability rights
//

import SwiftUI

struct DataExportView: View {
    @EnvironmentObject var webSocketService: WebSocketService
    @Environment(\.presentationMode) var presentationMode

    @State private var exportStatus: ExportStatus = .idle
    @State private var exportData: String = ""
    @State private var showingShareSheet = false
    @State private var errorMessage: String = ""

    enum ExportStatus {
        case idle
        case requesting
        case processing
        case ready
        case error
    }

    var body: some View {
        NavigationView {
            ScrollView(showsIndicators: false) {
                VStack(spacing: AppSpacing.md) {
                    // Header Icon
                    Image(systemName: "square.and.arrow.down.fill")
                        .font(.system(size: 60))
                        .foregroundColor(AppColors.info)
                        .padding(.top, AppSpacing.lg)

                    // Title and Description
                    VStack(spacing: AppSpacing.sm) {
                        Text("Export Your Data")
                            .font(.appTitle)
                            .foregroundColor(AppColors.primaryText)

                        Text("Request a copy of all your personal data stored in BaoLife. This includes your account information, character data, gameplay history, and more.")
                            .font(.appBody)
                            .foregroundColor(AppColors.secondaryText)
                            .multilineTextAlignment(.center)
                            .padding(.horizontal, AppSpacing.md)
                    }

                    // What's Included Section
                    VStack(alignment: .leading, spacing: AppSpacing.md) {
                        Text("What's Included")
                            .font(.appHeadline)
                            .foregroundColor(AppColors.primaryText)
                            .padding(.horizontal, AppSpacing.md)

                        VStack(spacing: AppSpacing.sm) {
                            DataIncludedRow(icon: "person.fill", title: "Account Information", description: "Username, email, registration date")
                            DataIncludedRow(icon: "figure.walk", title: "Character Data", description: "All character details, attributes, appearance")
                            DataIncludedRow(icon: "chart.line.uptrend.xyaxis", title: "Game Progress", description: "Achievements, statistics, records")
                            DataIncludedRow(icon: "heart.fill", title: "Relationships", description: "All relationships and affinity levels")
                            DataIncludedRow(icon: "bubble.left.and.bubble.right.fill", title: "Conversations", description: "Chat history with characters")
                            DataIncludedRow(icon: "cart.fill", title: "Purchase History", description: "All in-app purchase records")
                        }
                        .padding(.horizontal, AppSpacing.md)
                    }
                    .padding(.vertical, AppSpacing.xs)

                    // Status Display
                    if exportStatus != .idle {
                        BaseCard(
                            backgroundColor: AppColors.surfaceElevated
                        ) {
                            VStack(spacing: AppSpacing.md) {
                                switch exportStatus {
                                case .requesting:
                                    ProgressView()
                                        .scaleEffect(1.5)
                                    Text("Requesting export...")
                                        .font(.appBody)
                                        .foregroundColor(AppColors.secondaryText)

                                case .processing:
                                    ProgressView()
                                        .scaleEffect(1.5)
                                    Text("Preparing your data...")
                                        .font(.appBody)
                                        .foregroundColor(AppColors.secondaryText)
                                    Text("This may take a few minutes")
                                        .font(.appCaption)
                                        .foregroundColor(AppColors.secondaryText)

                                case .ready:
                                    Image(systemName: "checkmark.circle.fill")
                                        .font(.system(size: 50))
                                        .foregroundColor(AppColors.success)
                                    Text("Export Ready!")
                                        .font(.appHeadline)
                                        .foregroundColor(AppColors.success.darker(by: 0.2))

                                    Button(action: {
                                        showingShareSheet = true
                                    }) {
                                        HStack(spacing: AppSpacing.xs) {
                                            Image(systemName: "square.and.arrow.up")
                                            Text("Share Export")
                                        }
                                        .font(.appBodyBold)
                                        .foregroundColor(.white)
                                        .frame(maxWidth: .infinity)
                                        .padding()
                                        .background(AppColors.info)
                                        .cornerRadius(AppSpacing.cornerRadius)
                                    }

                                    Button(action: {
                                        // Copy to clipboard
                                        UIPasteboard.general.string = exportData
                                    }) {
                                        HStack(spacing: AppSpacing.xs) {
                                            Image(systemName: "doc.on.doc")
                                            Text("Copy to Clipboard")
                                        }
                                        .font(.appBodyBold)
                                        .foregroundColor(AppColors.info)
                                        .frame(maxWidth: .infinity)
                                        .padding()
                                        .background(AppColors.info.opacity(0.15))
                                        .cornerRadius(AppSpacing.cornerRadius)
                                    }

                                case .error:
                                    Image(systemName: "exclamationmark.triangle.fill")
                                        .font(.system(size: 50))
                                        .foregroundColor(AppColors.error)
                                    Text("Export Failed")
                                        .font(.appHeadline)
                                        .foregroundColor(AppColors.error.darker(by: 0.2))
                                    Text(errorMessage)
                                        .font(.appBody)
                                        .foregroundColor(AppColors.secondaryText)
                                        .multilineTextAlignment(.center)

                                case .idle:
                                    EmptyView()
                                }
                            }
                        }
                        .padding(.horizontal, AppSpacing.md)
                    }

                    // Request Button
                    if exportStatus == .idle || exportStatus == .error {
                        Button(action: requestExport) {
                            HStack(spacing: AppSpacing.xs) {
                                Image(systemName: "arrow.down.circle.fill")
                                Text(exportStatus == .error ? "Try Again" : "Request Export")
                                    .fontWeight(.semibold)
                            }
                            .font(.appBodyBold)
                            .foregroundColor(.white)
                            .frame(maxWidth: .infinity)
                            .padding()
                            .background(AppColors.info)
                            .cornerRadius(AppSpacing.cornerRadius)
                        }
                        .padding(.horizontal, AppSpacing.md)
                    }

                    // GDPR Notice
                    BaseCard(
                        backgroundColor: AppColors.info.opacity(0.1),
                        borderColor: AppColors.info.opacity(0.3)
                    ) {
                        VStack(alignment: .leading, spacing: AppSpacing.sm) {
                            HStack(spacing: AppSpacing.xs) {
                                Image(systemName: "info.circle.fill")
                                    .foregroundColor(AppColors.info.darker(by: 0.2))
                                Text("Your Rights")
                                    .font(.appHeadline)
                                    .foregroundColor(AppColors.primaryText)
                            }

                            Text("Under GDPR and data protection laws, you have the right to access and receive a copy of your personal data in a portable format. This export will be provided in JSON format, which can be opened with any text editor.")
                                .font(.appBody)
                                .foregroundColor(AppColors.secondaryText)

                            Text("Processing time: Usually immediate, up to 30 days for complex requests.")
                                .font(.appCaption)
                                .foregroundColor(AppColors.secondaryText)
                                .padding(.top, 4)
                        }
                    }
                    .padding(.horizontal, AppSpacing.md)

                    Spacer(minLength: AppSpacing.xl)
                }
                .padding(.bottom, AppSpacing.xl)
            }
            .background(AppColors.background)
            .navigationBarTitle("Export Data", displayMode: .inline)
            .navigationBarItems(
                leading: Button("Close") {
                    presentationMode.wrappedValue.dismiss()
                }
            )
            .sheet(isPresented: $showingShareSheet) {
                if #available(iOS 16.0, *) {
                    ShareSheet(items: [exportData])
                } else {
                    ShareSheet(items: [exportData])
                }
            }
        }
        .onAppear {
            setupExportListener()
        }
    }

    // MARK: - Functions

    private func requestExport() {
        exportStatus = .requesting
        errorMessage = ""

        // Send export request via WebSocket
        let message: [String: Any] = [
            "type": "exportData",
            "userId": webSocketService.person.id
        ]

        webSocketService.sendMessage(message: message)

        // Simulate processing state after request is sent
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            if exportStatus == .requesting {
                exportStatus = .processing
            }
        }

        // Timeout after 60 seconds
        DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) {
            if exportStatus == .processing {
                exportStatus = .error
                errorMessage = "Export request timed out. Please try again or contact support."
            }
        }
    }

    private func setupExportListener() {
        // Listen for export completion
        // In a real implementation, you would add a notification observer
        // or check for updates to a @Published property in WebSocketService
        NotificationCenter.default.addObserver(
            forName: NSNotification.Name("DataExportReady"),
            object: nil,
            queue: .main
        ) { notification in
            if let data = notification.userInfo?["exportData"] as? String {
                exportData = data
                exportStatus = .ready
            } else {
                exportStatus = .error
                errorMessage = "Failed to retrieve export data. Please try again."
            }
        }

        NotificationCenter.default.addObserver(
            forName: NSNotification.Name("DataExportFailed"),
            object: nil,
            queue: .main
        ) { notification in
            exportStatus = .error
            if let error = notification.userInfo?["error"] as? String {
                errorMessage = error
            } else {
                errorMessage = "Export failed. Please try again or contact support."
            }
        }
    }
}

// MARK: - Supporting Views

struct DataIncludedRow: View {
    let icon: String
    let title: String
    let description: String

    var body: some View {
        HStack(alignment: .top, spacing: AppSpacing.sm) {
            Image(systemName: icon)
                .font(.system(size: 20))
                .foregroundColor(AppColors.info)
                .frame(width: 30)

            VStack(alignment: .leading, spacing: 4) {
                Text(title)
                    .font(.appBodyBold)
                    .foregroundColor(AppColors.primaryText)
                Text(description)
                    .font(.appCaption)
                    .foregroundColor(AppColors.secondaryText)
            }

            Spacer()
        }
        .padding(AppSpacing.md)
        .background(AppColors.info.opacity(0.08))
        .cornerRadius(AppSpacing.cornerRadius)
    }
}

// MARK: - Share Sheet

struct ShareSheet: UIViewControllerRepresentable {
    let items: [Any]

    func makeUIViewController(context: Context) -> UIActivityViewController {
        let controller = UIActivityViewController(activityItems: items, applicationActivities: nil)
        return controller
    }

    func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {
        // No update needed
    }
}

// MARK: - Preview
// Preview removed - requires backend connection
