import SwiftData
import Foundation

@Model
final class ReviewCard {
    var key: String = ""
    var verbId: Int = 0
    var tenseId: String = ""
    var personIndex: Int = 0

    var easeFactor: Double = 2.5
    var interval: Int = 0
    var repetitions: Int = 0
    var dueDate: Date = Date()
    var lastReviewDate: Date?



    init(verbId: Int, tenseId: String, personIndex: Int) {
        self.key = Self.makeKey(verbId: verbId, tenseId: tenseId, personIndex: personIndex)
        self.verbId = verbId
        self.tenseId = tenseId
        self.personIndex = personIndex
    }

    static func makeKey(verbId: Int, tenseId: String, personIndex: Int) -> String {
        "\(verbId)|\(tenseId)|\(personIndex)"
    }

    func refreshIdentityIfNeeded() {
        let expected = Self.makeKey(verbId: verbId, tenseId: tenseId, personIndex: personIndex)
        if key != expected {
            key = expected
        }
    }
}

@Model
final class CourseReviewCard {
    var id: String = ""
    var deckId: String = ""
    var front: String = ""
    var back: String = ""

    var easeFactor: Double = 2.5
    var interval: Int = 0
    var repetitions: Int = 0
    var dueDate: Date = Date()
    var lastReviewDate: Date?

    init(id: String, deckId: String, front: String, back: String) {
        self.id = id
        self.deckId = deckId
        self.front = front
        self.back = back
    }
}

/// SRS record for verb-level vocab practice (EN ↔ ES infinitive recall),
/// separate from per-form `ReviewCard` so a user's vocab progress doesn't
/// collide with conjugation form mastery.
///
/// CloudKit-synced; uniqueness on `id` is enforced via fetch-or-create in
/// `VerbReviewStore` since CloudKit forbids `@Attribute(.unique)`.
@Model
final class VerbReviewCard {
    var id: String = ""
    var verbId: Int = 0

    var easeFactor: Double = 2.5
    var interval: Int = 0
    var repetitions: Int = 0
    var dueDate: Date = Date()
    var lastReviewDate: Date?

    init(verbId: Int) {
        self.id = Self.makeId(verbId: verbId)
        self.verbId = verbId
    }

    static func makeId(verbId: Int) -> String {
        "verb-\(verbId)"
    }
}
