import Testing
import Foundation
@testable import 康康

struct TimelineGroupingTests {

    private let now: Date = {
        var c = DateComponents()
        c.year = 2026; c.month = 5; c.day = 25; c.hour = 12
        return Calendar(identifier: .gregorian).date(from: c)!
    }()

    @Test func timelineKindOrderMatchesRecordFilterChips() {
        #expect(TimelineKind.allCases == [.diary, .symptom, .indicator, .medication, .report])
    }

    @Test func todaySection() {
        #expect(TimelineGrouping.section(for: now, now: now) == .today)
    }

    @Test func yesterdaySection() {
        let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: now)!
        #expect(TimelineGrouping.section(for: yesterday, now: now) == .yesterday)
    }

    @Test func thisWeekSection() {
        // 5/25 是 周一, 同周稍早(周日 5/24 在多数 zh_CN 周历里可能算上周;这里测明确同周的 3 天前可能跨周,改用 within-week)
        let cal = Calendar(identifier: .gregorian)
        let twoDaysAgo = cal.date(byAdding: .day, value: -2, to: now)!
        let section = TimelineGrouping.section(for: twoDaysAgo, now: now, calendar: cal)
        // 2 天前要么是 .thisWeek 要么是 .yesterday/.thisMonth — 关键是不能是 .today
        #expect(section != .today)
    }

    @Test func thisMonthSection() {
        let earlierThisMonth = Calendar.current.date(byAdding: .day, value: -15, to: now)!
        let section = TimelineGrouping.section(for: earlierThisMonth, now: now)
        #expect(section == .thisMonth)
    }

    @Test func yearSection() {
        var c = DateComponents()
        c.year = 2024; c.month = 3; c.day = 1
        let oldDate = Calendar(identifier: .gregorian).date(from: c)!
        let section = TimelineGrouping.section(for: oldDate, now: now)
        #expect(section == .year(2024))
    }

    @Test func sectionOrderingTodayFirst() {
        let cal = Calendar(identifier: .gregorian)
        let yesterday = cal.date(byAdding: .day, value: -1, to: now)!
        let lastYear = cal.date(byAdding: .year, value: -1, to: now)!

        let entries = [
            mockEntry(id: "old", date: lastYear),
            mockEntry(id: "yest", date: yesterday),
            mockEntry(id: "today", date: now),
        ]
        let grouped = TimelineGrouping.group(entries, now: now, calendar: cal)
        let labels = grouped.map { $0.section.label }
        #expect(labels.first == "今天")
        #expect(labels.last?.contains("年") == true)
    }

    @Test func formatDurationBoundaries() {
        #expect(formatDuration(0) == "刚刚")
        #expect(formatDuration(30) == "刚刚")            // < 1 min
        #expect(formatDuration(120) == "2 分钟")          // 2 min
        #expect(formatDuration(3600) == "1 小时")         // 1h
        #expect(formatDuration(3600 + 1800) == "1 小时 30 分")
        #expect(formatDuration(86400) == "1 天")
        #expect(formatDuration(86400 + 3600) == "1 天 1 小时")
    }

    private func mockEntry(id: String, date: Date) -> TimelineEntry {
        TimelineEntry(
            id: id,
            kind: .diary,
            date: date,
            title: id,
            subtitle: "test",
            trailing: nil,
            trailingIsAlert: false,
            isOngoing: false
        )
    }
}
