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

import Combine
import SwiftUI

// MARK: - Home Item Model
// Model item Home

/// Item model for home screen display
/// Model item để hiển thị trên màn hình home
struct HomeItem: Identifiable, Equatable {
    let id: String
    let title: String
    let subtitle: String
    let imageUrl: String?
    let category: String

    #if DEBUG
        static let samples: [HomeItem] = [
            HomeItem(
                id: "1",
                title: "Khám phá địa điểm mới",
                subtitle: "Tìm kiếm những trải nghiệm tuyệt vời",
                imageUrl: nil,
                category: "explore"
            ),
            HomeItem(
                id: "2",
                title: "Ưu đãi hôm nay",
                subtitle: "Giảm đến 50% cho thành viên",
                imageUrl: nil,
                category: "promo"
            ),
            HomeItem(
                id: "3",
                title: "Điểm thưởng của bạn",
                subtitle: "1,250 điểm có thể sử dụng",
                imageUrl: nil,
                category: "points"
            ),
            HomeItem(
                id: "4",
                title: "Đề xuất cho bạn",
                subtitle: "Dựa trên sở thích cá nhân",
                imageUrl: nil,
                category: "recommend"
            ),
        ]
    #endif
}

// MARK: - Home ViewModel
// ViewModel Home

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

    // MARK: - Published Properties

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

    /// Refreshing state (pull-to-refresh)
    /// Trạng thái refreshing (kéo để làm mới)
    @Published var isRefreshing: Bool = false

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

    /// List of home items
    /// Danh sách items trang home
    @Published var items: [HomeItem] = []

    /// Featured items for carousel
    /// Items nổi bật cho carousel
    @Published var featuredItems: [HomeItem] = []

    /// Greeting message based on time
    /// Lời chào dựa trên thời gian
    @Published var greeting: String = ""

    // MARK: - Dependencies

    /// API service for network requests
    /// Dịch vụ API cho các request network
    private let apiService: APIServiceProtocol

    /// Auth manager for user info
    /// Quản lý xác thực cho thông tin user
    private let authManager: AuthManager

    // MARK: - Init

    /// Initialize ViewModel
    /// Khởi tạo ViewModel
    /// - Parameters:
    ///   - apiService: API service instance / Instance dịch vụ API
    ///   - authManager: Auth manager instance / Instance quản lý xác thực
    init(
        apiService: APIServiceProtocol = APIService.shared,
        authManager: AuthManager = .shared
    ) {
        self.apiService = apiService
        self.authManager = authManager
        updateGreeting()
    }

    // MARK: - Public Methods

    /// Load home data
    /// Tải dữ liệu home
    func loadData() async {
        guard !isLoading else { return }

        isLoading = true
        errorMessage = nil

        defer { isLoading = false }

        do {
            // Simulate API call with mock data for now
            // Mô phỏng gọi API với mock data tạm thời
            try await Task.sleep(nanoseconds: 500_000_000)  // 0.5s

            #if DEBUG
                items = HomeItem.samples
                featuredItems = Array(HomeItem.samples.prefix(2))
            #else
                // Real API call
                // Gọi API thật
                // let response: HomeResponse = try await apiService.get(endpoint: "/home")
                // items = response.items
                // featuredItems = response.featured
            #endif

        } catch {
            errorMessage = error.localizedDescription
            print("HomeViewModel.loadData error: \(error)")
        }
    }

    /// Refresh data (pull-to-refresh)
    /// Làm mới dữ liệu (kéo để làm mới)
    func refresh() async {
        guard !isRefreshing else { return }

        isRefreshing = true
        defer { isRefreshing = false }

        await loadData()
    }

    /// Handle item tap
    /// Xử lý khi tap item
    /// - Parameter item: Tapped item / Item được tap
    func handleItemTap(_ item: HomeItem) {
        // Navigate or perform action based on item
        // Điều hướng hoặc thực hiện action dựa trên item
        print("Item tapped: \(item.title)")
    }

    // MARK: - Private Methods

    /// Update greeting based on current time
    /// Cập nhật lời chào dựa trên thời gian hiện tại
    private func updateGreeting() {
        let hour = Calendar.current.component(.hour, from: Date())
        let userName = authManager.currentUser?.firstName ?? "bạn"

        switch hour {
        case 5..<12:
            greeting = "Chào buổi sáng, \(userName)! ☀️"
        case 12..<17:
            greeting = "Chào buổi chiều, \(userName)! 🌤️"
        case 17..<21:
            greeting = "Chào buổi tối, \(userName)! 🌆"
        default:
            greeting = "Xin chào, \(userName)! 🌙"
        }
    }
}
