//
//  ConfirmationDialog.swift
//  lichunWebsocket
//
//  Reusable confirmation dialog patterns
//

import SwiftUI

// MARK: - Confirmation Action
struct ConfirmationAction: Identifiable {
    let id = UUID()
    let title: String
    let isDestructive: Bool
    let action: () -> Void

    init(title: String, isDestructive: Bool = false, action: @escaping () -> Void) {
        self.title = title
        self.isDestructive = isDestructive
        self.action = action
    }
}

// MARK: - View Extension for Simple Confirmations
extension View {
    /// Add a confirmation dialog with destructive action
    func confirmationDialog(
        isPresented: Binding<Bool>,
        title: String,
        message: String? = nil,
        destructiveAction: @escaping () -> Void,
        destructiveTitle: String = "Delete",
        cancelTitle: String = "Cancel"
    ) -> some View {
        self.confirmationDialog(title, isPresented: isPresented) {
            Button(destructiveTitle, role: .destructive) {
                hapticNotification(type: .warning)
                destructiveAction()
            }

            Button(cancelTitle, role: .cancel) {
                // Dismiss
            }
        } message: {
            if let message = message {
                Text(message)
            }
        }
    }
}

// MARK: - Custom Confirmation Dialog
struct CustomConfirmationDialog: View {
    let title: String
    let message: String
    let destructiveTitle: String
    let cancelTitle: String
    let onConfirm: () -> Void
    let onCancel: () -> Void

    @Environment(\.dismiss) private var dismiss

    init(
        title: String,
        message: String,
        destructiveTitle: String = "Delete",
        cancelTitle: String = "Cancel",
        onConfirm: @escaping () -> Void,
        onCancel: @escaping () -> Void
    ) {
        self.title = title
        self.message = message
        self.destructiveTitle = destructiveTitle
        self.cancelTitle = cancelTitle
        self.onConfirm = onConfirm
        self.onCancel = onCancel
    }

    var body: some View {
        VStack(spacing: AppSpacing.lg) {
            // Warning Icon
            Image(systemName: "exclamationmark.triangle.fill")
                .font(.system(size: 50))
                .foregroundColor(AppColors.warning)
                .accessibilityHidden(true)

            // Title
            Text(title)
                .font(.appLargeTitle)
                .foregroundColor(AppColors.primaryText)
                .multilineTextAlignment(.center)
                .accessibilityAddTraits(.isHeader)

            // Message
            Text(message)
                .font(.appBody)
                .foregroundColor(AppColors.secondaryText)
                .multilineTextAlignment(.center)
                .fixedSize(horizontal: false, vertical: true)

            // Action Buttons
            HStack(spacing: AppSpacing.md) {
                // Cancel Button
                Button(cancelTitle) {
                    hapticFeedback(style: .light)
                    onCancel()
                }
                .font(.appBodyBold)
                .foregroundColor(AppColors.secondaryText)
                .frame(maxWidth: .infinity)
                .frame(height: AppSpacing.buttonHeight)
                .background(AppColors.cardBackground)
                .cornerRadius(AppSpacing.cornerRadius)
                .accessibilityLabel("Cancel")
                .accessibilityHint("Dismiss this dialog without taking action")

                // Destructive Button
                Button(destructiveTitle) {
                    hapticNotification(type: .warning)
                    onConfirm()
                }
                .font(.appBodyBold)
                .foregroundColor(AppColors.error)
                .frame(maxWidth: .infinity)
                .frame(height: AppSpacing.buttonHeight)
                .background(AppColors.error.opacity(0.1))
                .cornerRadius(AppSpacing.cornerRadius)
                .accessibilityLabel(destructiveTitle)
                .accessibilityHint("Confirm and perform this action")
                .accessibilityAddTraits(.isButton)
            }
        }
        .padding(AppSpacing.xl)
        .background(AppColors.background)
        .cornerRadius(AppSpacing.cornerRadius)
        .shadow(color: Color.black.opacity(0.3), radius: 20)
        .accessibilityElement(children: .contain)
    }
}

// MARK: - Alert Confirmation Dialog (Non-Destructive)
struct AlertConfirmationDialog: View {
    let title: String
    let message: String
    let primaryTitle: String
    let secondaryTitle: String?
    let onPrimary: () -> Void
    let onSecondary: (() -> Void)?

    @Environment(\.dismiss) private var dismiss

    init(
        title: String,
        message: String,
        primaryTitle: String = "OK",
        secondaryTitle: String? = nil,
        onPrimary: @escaping () -> Void,
        onSecondary: (() -> Void)? = nil
    ) {
        self.title = title
        self.message = message
        self.primaryTitle = primaryTitle
        self.secondaryTitle = secondaryTitle
        self.onPrimary = onPrimary
        self.onSecondary = onSecondary
    }

    var body: some View {
        VStack(spacing: AppSpacing.lg) {
            // Info Icon
            Image(systemName: "info.circle.fill")
                .font(.system(size: 50))
                .foregroundColor(AppColors.info)
                .accessibilityHidden(true)

            // Title
            Text(title)
                .font(.appLargeTitle)
                .foregroundColor(AppColors.primaryText)
                .multilineTextAlignment(.center)
                .accessibilityAddTraits(.isHeader)

            // Message
            Text(message)
                .font(.appBody)
                .foregroundColor(AppColors.secondaryText)
                .multilineTextAlignment(.center)
                .fixedSize(horizontal: false, vertical: true)

            // Action Buttons
            if let secondaryTitle = secondaryTitle, let onSecondary = onSecondary {
                HStack(spacing: AppSpacing.md) {
                    // Secondary Button
                    Button(secondaryTitle) {
                        hapticFeedback(style: .light)
                        onSecondary()
                    }
                    .font(.appBodyBold)
                    .foregroundColor(AppColors.secondaryText)
                    .frame(maxWidth: .infinity)
                    .frame(height: AppSpacing.buttonHeight)
                    .background(AppColors.cardBackground)
                    .cornerRadius(AppSpacing.cornerRadius)

                    // Primary Button
                    Button(primaryTitle) {
                        hapticFeedback(style: .medium)
                        onPrimary()
                    }
                    .font(.appBodyBold)
                    .foregroundColor(AppColors.primaryText)
                    .frame(maxWidth: .infinity)
                    .frame(height: AppSpacing.buttonHeight)
                    .background(AppColors.primary)
                    .cornerRadius(AppSpacing.cornerRadius)
                }
            } else {
                // Single Primary Button
                Button(primaryTitle) {
                    hapticFeedback(style: .medium)
                    onPrimary()
                }
                .font(.appBodyBold)
                .foregroundColor(AppColors.primaryText)
                .frame(maxWidth: .infinity)
                .frame(height: AppSpacing.buttonHeight)
                .background(AppColors.primary)
                .cornerRadius(AppSpacing.cornerRadius)
            }
        }
        .padding(AppSpacing.xl)
        .background(AppColors.background)
        .cornerRadius(AppSpacing.cornerRadius)
        .shadow(color: Color.black.opacity(0.3), radius: 20)
        .accessibilityElement(children: .contain)
    }
}

// MARK: - Confirmation Dialog Modifier
struct ConfirmationDialogModifier: ViewModifier {
    @Binding var isPresented: Bool
    let dialog: AnyView

    func body(content: Content) -> some View {
        ZStack {
            content

            if isPresented {
                AppColors.modalOverlay
                    .ignoresSafeArea()
                    .onTapGesture {
                        withAnimation(AppAnimations.standard) {
                            isPresented = false
                        }
                    }

                dialog
                    .padding(.horizontal, AppSpacing.xl)
                    .transition(.scale.combined(with: .opacity))
            }
        }
        .animation(AppAnimations.standard, value: isPresented)
    }
}

extension View {
    /// Present a custom confirmation dialog
    func customConfirmationDialog<Content: View>(
        isPresented: Binding<Bool>,
        @ViewBuilder dialog: @escaping () -> Content
    ) -> some View {
        self.modifier(
            ConfirmationDialogModifier(
                isPresented: isPresented,
                dialog: AnyView(dialog())
            )
        )
    }
}

// MARK: - Preview
#if DEBUG
struct ConfirmationDialog_Previews: PreviewProvider {
    static var previews: some View {
        VStack(spacing: AppSpacing.xl) {
            CustomConfirmationDialog(
                title: "Delete Character?",
                message: "This action cannot be undone. All progress will be lost.",
                destructiveTitle: "Delete",
                cancelTitle: "Cancel",
                onConfirm: { print("Confirmed") },
                onCancel: { print("Cancelled") }
            )
            .padding()

            AlertConfirmationDialog(
                title: "Achievement Unlocked!",
                message: "You've reached level 10 in your career!",
                primaryTitle: "Awesome!",
                onPrimary: { print("Acknowledged") }
            )
            .padding()
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .background(AppColors.background)
    }
}
#endif
