//
//  ProfileViewModel.swift
//  AppClientBaseSwift
//
//  ViewModel for Profile screen with MVVM pattern
//  ViewModel cho màn hình Profile theo pattern MVVM
//

import Combine
import SwiftUI

// MARK: - Profile Menu Item
// Item menu Profile

/// Profile menu item model
/// Model item menu profile
struct ProfileMenuItem: Identifiable, Equatable {
    let id: String
    let title: String
    let subtitle: String?
    let icon: String
    let action: ProfileMenuAction

    static func == (lhs: ProfileMenuItem, rhs: ProfileMenuItem) -> Bool {
        lhs.id == rhs.id
    }
}

/// Profile menu actions
/// Các action menu profile
enum ProfileMenuAction: String {
    case editProfile
    case notifications
    case security
    case language
    case help
    case about
    case apiDebugger  // Debug only
    case logout
}

// MARK: - Profile ViewModel
// ViewModel Profile

/// ViewModel for Profile screen
/// ViewModel cho màn hình Profile
@MainActor
final class ProfileViewModel: ObservableObject {

    // MARK: - Published Properties

    /// Current user
    /// Người dùng hiện tại
    @Published var user: User?

    /// Loading state
    /// Trạng thái loading
    @Published var isLoading: Bool = false

    /// Error message if any
    /// Thông báo lỗi nếu có
    @Published var errorMessage: String?

    /// Show logout confirmation alert
    /// Hiển thị alert xác nhận đăng xuất
    @Published var showLogoutAlert: Bool = false
    
    /// Show API debugger sheet
    /// Hiển thị sheet API debugger
    @Published var showAPIDebugger: Bool = false

    /// Menu items for profile screen
    /// Các item menu cho màn hình profile
    @Published var menuItems: [ProfileMenuItem] = []

    // MARK: - Dependencies

    /// Auth manager for user operations
    /// Quản lý xác thực cho các thao tác user
    private let authManager: AuthManager

    // MARK: - Init

    /// Initialize ViewModel
    /// Khởi tạo ViewModel
    /// - Parameter authManager: Auth manager instance / Instance quản lý xác thực
    init(authManager: AuthManager = .shared) {
        self.authManager = authManager
        loadUser()
        setupMenuItems()
    }

    // MARK: - Public Methods

    /// Load current user data
    /// Tải dữ liệu người dùng hiện tại
    func loadUser() {
        user = authManager.currentUser

        #if DEBUG
            if user == nil {
                user = User.sample
            }
        #endif
    }

    /// Refresh user data from API
    /// Làm mới dữ liệu user từ API
    func refreshUser() async {
        guard !isLoading else { return }

        isLoading = true
        errorMessage = nil

        defer { isLoading = false }

        await authManager.refreshCurrentUser()
        loadUser()
    }

    /// Handle menu item tap
    /// Xử lý khi tap menu item
    /// - Parameter item: Tapped menu item / Item menu được tap
    func handleMenuTap(_ item: ProfileMenuItem) {
        switch item.action {
        case .editProfile:
            // Navigate to edit profile
            // Điều hướng đến chỉnh sửa profile
            print("Navigate to edit profile")

        case .notifications:
            // Navigate to notification settings
            // Điều hướng đến cài đặt thông báo
            print("Navigate to notifications")

        case .security:
            // Navigate to security settings
            // Điều hướng đến cài đặt bảo mật
            print("Navigate to security")

        case .language:
            // Navigate to language settings
            // Điều hướng đến cài đặt ngôn ngữ
            print("Navigate to language")

        case .help:
            // Navigate to help center
            // Điều hướng đến trung tâm trợ giúp
            print("Navigate to help")

        case .about:
            // Navigate to about page
            // Điều hướng đến trang giới thiệu
            print("Navigate to about")
            
        case .apiDebugger:
            // Show API debugger sheet
            // Hiển thị sheet API debugger
            showAPIDebugger = true

        case .logout:
            // Show logout confirmation
            // Hiển thị xác nhận đăng xuất
            showLogoutAlert = true
        }
    }

    /// Confirm logout action
    /// Xác nhận action đăng xuất
    func confirmLogout() {
        authManager.logout()
    }

    // MARK: - Private Methods

    /// Setup menu items
    /// Thiết lập các item menu
    private func setupMenuItems() {
        menuItems = [
            ProfileMenuItem(
                id: "edit_profile",
                title: "profile_edit".localized,
                subtitle: nil,
                icon: "person.circle",
                action: .editProfile
            ),
            ProfileMenuItem(
                id: "notifications",
                title: "profile_notifications".localized,
                subtitle: nil,
                icon: "bell",
                action: .notifications
            ),
            ProfileMenuItem(
                id: "security",
                title: "profile_security".localized,
                subtitle: nil,
                icon: "lock.shield",
                action: .security
            ),
            ProfileMenuItem(
                id: "language",
                title: "profile_language".localized,
                subtitle: "Tiếng Việt",
                icon: "globe",
                action: .language
            ),
            ProfileMenuItem(
                id: "help",
                title: "profile_help".localized,
                subtitle: nil,
                icon: "questionmark.circle",
                action: .help
            ),
            ProfileMenuItem(
                id: "about",
                title: "profile_about".localized,
                subtitle: "v1.0.0",
                icon: "info.circle",
                action: .about
            ),
        ]
        
        // Add API Debugger in DEBUG mode only
        // Chỉ thêm API Debugger trong chế độ DEBUG
        #if DEBUG
        menuItems.append(
            ProfileMenuItem(
                id: "api_debugger",
                title: "🔧 API Debugger",
                subtitle: "Debug only",
                icon: "wrench.and.screwdriver",
                action: .apiDebugger
            )
        )
        #endif
        
        // Add logout at the end
        // Thêm logout ở cuối
        menuItems.append(
            ProfileMenuItem(
                id: "logout",
                title: "profile_logout".localized,
                subtitle: nil,
                icon: "rectangle.portrait.and.arrow.right",
                action: .logout
            )
        )
    }
}
