import Foundation
import SwiftData

@Model
final class Album {
    @Attribute(.unique) var id: String
    var title: String
    var modeRaw: String
    var mediaKindRaw: String?
    var itemsJSON: Data
    var updatedAt: Date

    var mode: AlbumMode {
        get { AlbumMode(rawValue: modeRaw) ?? .playlist }
        set { modeRaw = newValue.rawValue }
    }

    var mediaKind: PlaylistMediaKind? {
        get {
            guard let mediaKindRaw else { return nil }
            return PlaylistMediaKind(rawValue: mediaKindRaw)
        }
        set { mediaKindRaw = newValue?.rawValue }
    }

    var items: [AlbumItem] {
        get {
            (try? JSONDecoder().decode([AlbumItem].self, from: itemsJSON)) ?? []
        }
        set {
            itemsJSON = (try? JSONEncoder().encode(newValue)) ?? Data("[]".utf8)
        }
    }

    init(
        id: String = Album.makeID(),
        title: String,
        mode: AlbumMode,
        mediaKind: PlaylistMediaKind? = nil,
        items: [AlbumItem] = [],
        updatedAt: Date = Date()
    ) {
        self.id = id
        self.title = title
        self.modeRaw = mode.rawValue
        self.mediaKindRaw = mediaKind?.rawValue
        self.itemsJSON = (try? JSONEncoder().encode(items)) ?? Data("[]".utf8)
        self.updatedAt = updatedAt
    }

    static func makeID() -> String {
        "alb_\(Int(Date().timeIntervalSince1970 * 1_000_000))"
    }
}
