//
//  Constants.swift
//  LunarDatePicker
//
//  Created by Nguyen Van Duong on 7/4/25.
//

import Foundation
import UIKit

enum Constants {

  // MARK: - UI Dimensions
  enum UI {
    static let cellSizeWithPrice: CGFloat = 60
    static let cellSizeWithoutPrice: CGFloat = 40
    static let rangeViewCornerRadius: CGFloat = 6
    static let weekViewHeight: CGFloat = 28
    static let defaultPickerSize = CGSize(width: 445, height: 550)
    static let minimumLineSpacing: CGFloat = 4
    static let minimumInteritemSpacing: CGFloat = 0
  }

  // MARK: - Font Sizes
  enum FontSize {
    static let dateLabel: CGFloat = 16
    static let lunarDateLabel: CGFloat = 8
    static let priceLabel: CGFloat = 10
    static let monthHeader: CGFloat = 17
    static let weekLabel: CGFloat = 12
    static let title: CGFloat = 17
  }

  // MARK: - Layout Constants
  enum Layout {
    static let defaultCornerRadius: CGFloat = 4
    static let weekViewHorizontalPadding: CGFloat = 2
    static let calendarHorizontalPadding: CGFloat = 6
    static let weekViewSidePadding: CGFloat = 4
    /// Khoảng cách từ price tới lunarDate
    static let priceLabelTopSpacing: CGFloat = 6
    /// Khoảng cách từ lunarDate tới date
    static let lunarDateLabelTopSpacing: CGFloat = 2
    static let priceLabelBottomSpacing: CGFloat = 2
    static let monthHeaderLeftPadding: CGFloat = 8
    static let monthHeaderRightPadding: CGFloat = -16
    static let monthHeaderTopPadding: CGFloat = 20
    static let monthHeaderBottomPadding: CGFloat = -14
    static let cellPadding: CGFloat = 1
    static let monthHeaderHeight: CGFloat = 58
  }

  // MARK: - Calendar Configuration
  enum Calendar {
    static let numberOfRows = 6
    static let yearRangeOffset = 10
  }

  // MARK: - Weekday Names
  enum WeekdayNames {
    static let english = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
  }

  // MARK: - Month Names
  enum MonthNames {
    static let english = [
      "January", "February", "March", "April", "May", "June",
      "July", "August", "September", "October", "November", "December",
    ]
  }

  // MARK: - Performance Configuration
  enum Performance {
    static let maxCacheSize = 500
    /// Debounce delay for onMonthVisible callback to avoid excessive API calls
    /// when user scrolls quickly through months
    static let monthVisibleDebounceDelaySeconds: TimeInterval = 0.6
  }

  // MARK: - Date Range Configuration
  enum Julian {
    static let dayOffset = 2415021.076998695
    static let lunarMonthDays = 29.530588853
    static let dayThreshold = 2_299_161
    static let dayConstant = 32045
    static let dayConstantOld = 32083
  }
}
