//
//  LiquidGlassTabBar.swift
//  lichunWebsocket
//
//  Custom tab bar with Liquid Glass design
//

import SwiftUI

// MARK: - Tab Item Model

struct TabBarItem: Identifiable {
    let id: Int
    let icon: String
    let selectedIcon: String
    let label: String
    let badge: Int?

    init(id: Int, icon: String, selectedIcon: String? = nil, label: String, badge: Int? = nil) {
        self.id = id
        self.icon = icon
        self.selectedIcon = selectedIcon ?? icon
        self.label = label
        self.badge = badge
    }
}

// MARK: - Liquid Glass Tab Bar

struct LiquidGlassTabBar: View {
    @Binding var selectedTab: Int
    let items: [TabBarItem]
    let isMinimized: Bool
    let onMoreTapped: () -> Void

    @Namespace private var animation

    var body: some View {
        HStack(spacing: 0) {
            ForEach(items) { item in
                TabBarButton(
                    item: item,
                    isSelected: selectedTab == item.id && item.id != items.count - 1, // Never select "More" button
                    isMinimized: isMinimized,
                    namespace: animation
                ) {
                    // Check if this is the "More" button (last tab)
                    if item.id == items.count - 1 {
                        // Call the more tapped callback instead of changing tabs
                        hapticFeedback(style: .light)
                        onMoreTapped()
                    } else {
                        // Normal tab switching
                        withAnimation(.spring(response: 0.3, dampingFraction: 0.7)) {
                            selectedTab = item.id
                            hapticFeedback(style: .light)
                        }
                    }
                }
            }
        }
        .padding(.horizontal, isMinimized ? 12 : 8)
        .padding(.vertical, isMinimized ? 8 : 12)
        .background(
            LiquidGlassBackground()
        )
        .clipShape(RoundedRectangle(cornerRadius: isMinimized ? 24 : 28, style: .continuous))
        .shadow(color: Color.black.opacity(0.1), radius: isMinimized ? 8 : 12, x: 0, y: isMinimized ? 2 : 4)
        .padding(.horizontal, 16)
        .padding(.bottom, 8)
        .animation(.spring(response: 0.4, dampingFraction: 0.8), value: isMinimized)
    }
}

// MARK: - Tab Bar Button

private struct TabBarButton: View {
    let item: TabBarItem
    let isSelected: Bool
    let isMinimized: Bool
    let namespace: Namespace.ID
    let action: () -> Void

    var body: some View {
        Button(action: action) {
            VStack(spacing: isMinimized ? 0 : AppSpacing.xxs) {
                ZStack {
                    // Badge indicator
                    if let badge = item.badge, badge > 0 {
                        BadgeView(count: badge)
                            .offset(x: AppSpacing.cardInnerSpacing, y: -AppSpacing.sm)
                            .zIndex(1)
                    }

                    // Icon
                    Image(systemName: isSelected ? item.selectedIcon : item.icon)
                        .font(.system(size: isMinimized ? AppSpacing.iconSizeMedium : AppSpacing.iconSizeLarge, weight: isSelected ? .semibold : .regular))
                        .foregroundColor(isSelected ? AppColors.primary : AppColors.secondaryText)
                        .frame(width: AppSpacing.iconSizeLarge, height: AppSpacing.iconSizeLarge)
                }

                // Label (hidden when minimized)
                if !isMinimized {
                    Text(item.label)
                        .font(.appSmall)
                        .fontWeight(isSelected ? .semibold : .regular)
                        .foregroundColor(isSelected ? AppColors.primary : AppColors.secondaryText)
                        .lineLimit(1)
                        .minimumScaleFactor(0.7)
                        .transition(.opacity.combined(with: .scale(scale: 0.8, anchor: .center)))
                }
            }
            .frame(maxWidth: .infinity)
            .frame(height: isMinimized ? AppSpacing.minTouchTarget : 60)
            .background(
                ZStack {
                    if isSelected {
                        RoundedRectangle(cornerRadius: 16, style: .continuous)
                            .fill(AppColors.primary.opacity(0.12))
                            .matchedGeometryEffect(id: "selectedTab", in: namespace)
                    }
                }
            )
            .contentShape(Rectangle())
        }
        .buttonStyle(TabBarScaleButtonStyle())
        .accessibilityLabel(accessibilityLabel)
        .accessibilityHint(item.id == 3 ? "Opens quick actions" : "Switches tabs")
        .accessibilityAddTraits(isSelected ? .isSelected : [])
    }

    private var accessibilityLabel: String {
        if let badge = item.badge, badge > 0 {
            return "\(item.label), \(badge) unread"
        }
        return item.label
    }
}

// MARK: - Liquid Glass Background

private struct LiquidGlassBackground: View {
    @Environment(\.colorScheme) var colorScheme

    var body: some View {
        ZStack {
            // Base blur effect
            if colorScheme == .dark {
                Color.black.opacity(0.3)
            } else {
                Color.white.opacity(0.7)
            }

            // Material blur
            Rectangle()
                .fill(.ultraThinMaterial)

            // Warm tint overlay
            LinearGradient(
                colors: [
                    AppColors.surfaceElevated.opacity(0.6),
                    AppColors.background.opacity(0.5)
                ],
                startPoint: .topLeading,
                endPoint: .bottomTrailing
            )

            // Subtle border
            RoundedRectangle(cornerRadius: 28, style: .continuous)
                .strokeBorder(
                    LinearGradient(
                        colors: [
                            Color.white.opacity(colorScheme == .dark ? 0.2 : 0.5),
                            Color.white.opacity(colorScheme == .dark ? 0.1 : 0.3)
                        ],
                        startPoint: .topLeading,
                        endPoint: .bottomTrailing
                    ),
                    lineWidth: 1
                )
        }
    }
}

// MARK: - Badge View

private struct BadgeView: View {
    let count: Int

    var body: some View {
        Text("\(min(count, 99))")
            .font(.appMicroBold)
            .foregroundColor(.white)
            .padding(.horizontal, count > 9 ? AppSpacing.xxs : 0)
            .frame(minWidth: AppSpacing.badgeMinSize, minHeight: AppSpacing.badgeMinSize)
            .background(
                Circle()
                    .fill(AppColors.error)
            )
            .overlay(
                Circle()
                    .strokeBorder(Color.white, lineWidth: 1.5)
            )
    }
}

// MARK: - Scale Button Style

fileprivate struct TabBarScaleButtonStyle: ButtonStyle {
    func makeBody(configuration: Configuration) -> some View {
        configuration.label
            .scaleEffect(configuration.isPressed ? 0.95 : 1.0)
            .animation(.spring(response: 0.2, dampingFraction: 0.6), value: configuration.isPressed)
    }
}

// MARK: - Preview

#if DEBUG
struct LiquidGlassTabBar_Previews: PreviewProvider {
    static var previews: some View {
        VStack {
            Spacer()

            LiquidGlassTabBar(
                selectedTab: .constant(0),
                items: [
                    TabBarItem(id: 0, icon: "house", selectedIcon: "house.fill", label: "Home"),
                    TabBarItem(id: 1, icon: "calendar", selectedIcon: "calendar", label: "Activities"),
                    TabBarItem(id: 2, icon: "heart.circle", selectedIcon: "heart.circle.fill", label: "Social", badge: 3),
                    TabBarItem(id: 3, icon: "line.3.horizontal.circle", selectedIcon: "line.3.horizontal.circle.fill", label: "More")
                ],
                isMinimized: false,
                onMoreTapped: {}
            )
        }
        .background(AppColors.background)
        .previewDisplayName("Expanded")

        VStack {
            Spacer()

            LiquidGlassTabBar(
                selectedTab: .constant(1),
                items: [
                    TabBarItem(id: 0, icon: "house", selectedIcon: "house.fill", label: "Home"),
                    TabBarItem(id: 1, icon: "calendar", selectedIcon: "calendar", label: "Activities"),
                    TabBarItem(id: 2, icon: "heart.circle", selectedIcon: "heart.circle.fill", label: "Social"),
                    TabBarItem(id: 3, icon: "line.3.horizontal.circle", selectedIcon: "line.3.horizontal.circle.fill", label: "More")
                ],
                isMinimized: true,
                onMoreTapped: {}
            )
        }
        .background(AppColors.background)
        .previewDisplayName("Minimized")
    }
}
#endif
