import Foundation

enum CompanionWidgetSharedContainer {
    static let appGroupID = "group.Kotsch.Tech.DE-Companion.shared"
    static let widgetSnapshotFilename = "widget-snapshot.json"
    static let widgetImagesDirectory = "widget-images"
}

struct CompanionWidgetSnapshot: Codable {
    let generatedAt: Date
    let selectedProgramTitle: String
    let selectedProgramCode: String
    let todayEventCount: Int
    let totalLecturerCount: Int
    let totalRoomCount: Int
    let specialEventCount: Int
    let timetableState: CompanionWidgetFeedState
    let mensaState: CompanionWidgetFeedState
    let campusState: CompanionWidgetFeedState
    let campusPulseTimestamp: String?
    let nextEvent: CompanionWidgetEvent?
    let todayEvents: [CompanionWidgetEvent]
    let upcomingEvents: [CompanionWidgetEvent]
    let mensaDay: CompanionWidgetMensaDay?
    let campusEntries: [CompanionWidgetCampusEntry]
    let selectedProgramLiveEntry: CompanionWidgetCampusEntry?

    static let placeholder = CompanionWidgetSnapshot(
        generatedAt: .now,
        selectedProgramTitle: "Digital Engineering DE23-1",
        selectedProgramCode: "DE23-1",
        todayEventCount: 3,
        totalLecturerCount: 5,
        totalRoomCount: 4,
        specialEventCount: 1,
        timetableState: CompanionWidgetFeedState(label: "Stundenplan live", detail: "Aktuelle Daten", style: "live"),
        mensaState: CompanionWidgetFeedState(label: "Mensa live", detail: "Heute verfügbar", style: "live"),
        campusState: CompanionWidgetFeedState(label: "Campus aus", detail: "Nicht im Widget", style: "fallback"),
        campusPulseTimestamp: nil,
        nextEvent: CompanionWidgetEvent(
            id: "placeholder-next",
            subject: "DE-RMV",
            startDate: Date().addingTimeInterval(50 * 60),
            endDate: Date().addingTimeInterval(140 * 60),
            roomLabel: "SR302",
            lecturerLabel: "Lampe",
            note: "Projektblock",
            isSpecial: false,
            isLive: false
        ),
        todayEvents: [
            CompanionWidgetEvent(
                id: "placeholder-1",
                subject: "DE-RMV",
                startDate: Date().addingTimeInterval(50 * 60),
                endDate: Date().addingTimeInterval(140 * 60),
                roomLabel: "SR302",
                lecturerLabel: "Lampe",
                note: "Projektblock",
                isSpecial: false,
                isLive: false
            ),
            CompanionWidgetEvent(
                id: "placeholder-2",
                subject: "DE-ZSPLM",
                startDate: Date().addingTimeInterval(180 * 60),
                endDate: Date().addingTimeInterval(260 * 60),
                roomLabel: "SR203",
                lecturerLabel: "Hempe",
                note: nil,
                isSpecial: false,
                isLive: false
            )
        ],
        upcomingEvents: [
            CompanionWidgetEvent(
                id: "placeholder-1",
                subject: "DE-RMV",
                startDate: Date().addingTimeInterval(50 * 60),
                endDate: Date().addingTimeInterval(140 * 60),
                roomLabel: "SR302",
                lecturerLabel: "Lampe",
                note: "Projektblock",
                isSpecial: false,
                isLive: false
            ),
            CompanionWidgetEvent(
                id: "placeholder-2",
                subject: "DE-ZSPLM",
                startDate: Date().addingTimeInterval(180 * 60),
                endDate: Date().addingTimeInterval(260 * 60),
                roomLabel: "SR203",
                lecturerLabel: "Hempe",
                note: nil,
                isSpecial: false,
                isLive: false
            )
        ],
        mensaDay: CompanionWidgetMensaDay(
            title: "Heute",
            subtitle: "Freitag, 10. April",
            locationTitle: "Mensa Glauchau",
            meals: [
                CompanionWidgetMeal(id: "meal-1", category: "Hauptgericht", title: "Pasta mit Gemuese", priceText: "S: 3,50 EUR", imageUrl: nil, cachedImageFilename: nil),
                CompanionWidgetMeal(id: "meal-2", category: "Veggie", title: "Kartoffelpfanne", priceText: "S: 3,10 EUR", imageUrl: nil, cachedImageFilename: nil)
            ]
        ),
        campusEntries: [],
        selectedProgramLiveEntry: nil
    )
}

struct CompanionWidgetFeedState: Codable {
    let label: String
    let detail: String
    let style: String
}

struct CompanionWidgetEvent: Codable, Identifiable {
    let id: String
    let subject: String
    let startDate: Date
    let endDate: Date
    let roomLabel: String
    let lecturerLabel: String
    let note: String?
    let isSpecial: Bool
    let isLive: Bool
}

struct CompanionWidgetMensaDay: Codable {
    let title: String
    let subtitle: String
    let locationTitle: String
    let meals: [CompanionWidgetMeal]
}

struct CompanionWidgetMeal: Codable, Identifiable {
    let id: String
    let category: String
    let title: String
    let priceText: String
    let imageUrl: String?
    let cachedImageFilename: String?
}

struct CompanionWidgetCampusEntry: Codable, Identifiable {
    let id: String
    let programCode: String
    let subject: String
    let room: String
    let timeRange: String
}
