//
//  MIDIFile.swift
//  DashSmash
//
//  Minimal Standard MIDI File parser data used for MIDI-backed levels.
//

import Foundation

struct MIDISearchResult: Hashable {
    let title: String
    let artistName: String
    let pageURL: URL
}

struct MIDISong {
    let title: String
    let artistName: String
    let sourcePageURL: URL
    let downloadURL: URL
    let data: Data
    let parsedFile: MIDIParsedFile

    var sourceID: String {
        "midi:" + sourcePageURL.absoluteString
    }
}

struct MIDIParsedFile {
    let ticksPerQuarter: Int
    let bpm: Double
    let notes: [MIDINote]

    var totalBeats: Double {
        max(notes.map { $0.beat + max(0.25, $0.durationBeats) }.max() ?? 32, 16)
    }

    var durationSeconds: TimeInterval {
        totalBeats * 60.0 / bpm
    }
}

struct MIDINote {
    let beat: Double
    let durationBeats: Double
    let channel: Int
    let note: Int
    let velocity: Int
    let program: Int?

    var isPercussion: Bool { channel == 9 }
    var isBass: Bool { !isPercussion && note < 48 }
    var isLead: Bool { !isPercussion && note >= 72 }
    var isHarmony: Bool { !isPercussion && note >= 48 && note < 72 }
}
