//
//  View+Extensions.swift
//  AppClientBaseSwift
//
//  SwiftUI View extension helpers
//  Các extension helper cho SwiftUI View
//

import SwiftUI

#if os(iOS)
    import UIKit
#endif

// MARK: - View Modifiers
// Các modifier cho View

extension View {

    /// Apply card style with shadow
    /// Áp dụng style card với bóng đổ
    /// - Parameters:
    ///   - cornerRadius: Corner radius / Bo góc
    ///   - shadowRadius: Shadow radius / Bán kính bóng
    /// - Returns: Modified view / View đã được sửa đổi
    func cardStyle(cornerRadius: CGFloat = 12, shadowRadius: CGFloat = 4) -> some View {
        background(Color.white)
            .cornerRadius(cornerRadius)
            .shadow(color: Color.black.opacity(0.1), radius: shadowRadius, x: 0, y: 2)
    }

    /// Apply loading overlay
    /// Áp dụng overlay loading
    /// - Parameter isLoading: Loading state / Trạng thái loading
    /// - Returns: Modified view / View đã được sửa đổi
    func loadingOverlay(_ isLoading: Bool) -> some View {
        overlay {
            if isLoading {
                ZStack {
                    Color.black.opacity(0.3)
                        .ignoresSafeArea()
                    ProgressView()
                        .scaleEffect(1.5)
                        .tint(.white)
                }
            }
        }
    }

    /// Conditional modifier
    /// Modifier có điều kiện
    /// - Parameters:
    ///   - condition: Condition to check / Điều kiện kiểm tra
    ///   - transform: Transform to apply / Transform cần áp dụng
    /// - Returns: Modified view / View đã được sửa đổi
    @ViewBuilder
    func `if`<Content: View>(_ condition: Bool, transform: (Self) -> Content) -> some View {
        if condition {
            transform(self)
        } else {
            self
        }
    }

    /// Apply shimmer effect for loading placeholder
    /// Áp dụng hiệu ứng shimmer cho placeholder loading
    /// - Parameter isActive: Whether shimmer is active / Shimmer có đang hoạt động không
    /// - Returns: Modified view / View đã được sửa đổi
    func shimmer(isActive: Bool = true) -> some View {
        modifier(ShimmerModifier(isActive: isActive))
    }

    /// Hide keyboard
    /// Ẩn bàn phím
    func hideKeyboard() {
        #if os(iOS)
            UIApplication.shared.sendAction(
                #selector(UIResponder.resignFirstResponder),
                to: nil,
                from: nil,
                for: nil
            )
        #endif
    }
}

// MARK: - Shimmer Modifier
// Modifier hiệu ứng Shimmer

/// Shimmer loading effect modifier
/// Modifier hiệu ứng loading shimmer
struct ShimmerModifier: ViewModifier {
    let isActive: Bool
    @State private var phase: CGFloat = 0

    func body(content: Content) -> some View {
        if isActive {
            content
                .overlay(
                    GeometryReader { geometry in
                        LinearGradient(
                            colors: [
                                Color.white.opacity(0.1),
                                Color.white.opacity(0.5),
                                Color.white.opacity(0.1),
                            ],
                            startPoint: .leading,
                            endPoint: .trailing
                        )
                        .frame(width: geometry.size.width * 2)
                        .offset(x: -geometry.size.width + (geometry.size.width * 2 * phase))
                    }
                    .mask(content)
                )
                .onAppear {
                    withAnimation(
                        .linear(duration: 1.5)
                            .repeatForever(autoreverses: false)
                    ) {
                        phase = 1
                    }
                }
        } else {
            content
        }
    }
}

// MARK: - Navigation Helpers
// Các helper điều hướng

extension View {
    /// Navigate to destination on tap
    /// Điều hướng đến destination khi tap
    /// - Parameters:
    ///   - destination: Destination view / View đích
    /// - Returns: NavigationLink / NavigationLink
    func navigateTo<Destination: View>(@ViewBuilder destination: @escaping () -> Destination)
        -> some View
    {
        NavigationLink {
            destination()
        } label: {
            self
        }
        .buttonStyle(.plain)
    }
}
