//
//  Value.swift
//  Pods
//
//  Created by Nguyen Van Duong on 7/4/25.
//

import Foundation

public protocol PickerValue {
  static var mode: LDP_PickerMode { get }

  func outOfRange(minDate: Date?, maxDate: Date?) -> Bool
}

public struct PickerRange: PickerValue, Hashable {

  public var fromDate: Date

  public var toDate: Date

  public static let mode: LDP_PickerMode = .range

  public init(from fromDate: Date, to toDate: Date) {
    self.fromDate = fromDate
    self.toDate = toDate
  }

  public static func from(_ fromDate: Date, to toDate: Date) -> PickerRange {
    PickerRange(from: fromDate, to: toDate)
  }

  public var onSameDay: Bool {
    self.fromDate.isInSameDay(date: self.toDate)
  }

  public func outOfRange(minDate: Date?, maxDate: Date?) -> Bool {
    self.fromDate < minDate ?? self.fromDate
      || self.toDate > maxDate ?? self.toDate
  }
}

public enum PickerModeSingle {
  case single
}

public enum PickerModeRange {
  case range
}

// MARK: - Improved Mode Handling
extension PickerValue {
  public static var isRangeMode: Bool {
    return Self.mode == .range
  }

  public static var isSingleMode: Bool {
    return Self.mode == .single
  }
}

extension Date: PickerValue {

  public static var mode: LDP_PickerMode = .single

  public func outOfRange(minDate: Date?, maxDate: Date?) -> Bool {
    self < minDate ?? self || self > maxDate ?? self
  }
}
