import Foundation

// MARK: - TimeSignature

/// Musical time signature (e.g., 4/4, 3/4, 6/8).
struct TimeSignature: Equatable, Hashable {
    let beatsPerMeasure: Int   // Numerator: how many beats per measure
    let noteValue: Int         // Denominator: which note gets one beat (4 = quarter)

    /// Total beats in a measure expressed in quarter-note beats.
    /// For 4/4: 4 quarter-note beats.
    /// For 6/8: 6 eighth-note beats = 3 quarter-note beats.
    var quarterNoteBeatsPerMeasure: Double {
        let beatDuration = 4.0 / Double(noteValue)  // duration of one beat in quarter notes
        return Double(beatsPerMeasure) * beatDuration
    }

    /// Parse from string like "4/4", "3/4", "6/8"
    static func parse(_ str: String) -> TimeSignature? {
        let parts = str.trimmingCharacters(in: .whitespaces).split(separator: "/")
        guard parts.count == 2,
              let beats = Int(parts[0]),
              let value = Int(parts[1]),
              beats > 0,
              [1, 2, 4, 8, 16].contains(value) else {
            return nil
        }
        return TimeSignature(beatsPerMeasure: beats, noteValue: value)
    }
}

extension TimeSignature: CustomStringConvertible {
    var description: String {
        return "\(beatsPerMeasure)/\(noteValue)"
    }
}
