// TerminalFont.swift
// Represents a named monospace font that can be applied to the terminal view.
//
// T-2.3 note: JetBrains Mono font file is NOT bundled yet — that is deferred
// to T-2.12.  Until then, `jetBrainsMono` falls back to the system monospaced
// font so the struct is usable without crashing.

import UIKit

public struct TerminalFont: Identifiable, Sendable {

    // MARK: Properties

    public let id: String
    public let displayName: String

    /// The `UIFont` at whatever point size was requested when the static
    /// preset was created.  `FontStore` applies its own `size` override via
    /// `uiFont.withSize(_:)` before passing the font to `TerminalView`.
    public let uiFont: UIFont

    // MARK: Init

    public init(id: String, displayName: String, uiFont: UIFont) {
        self.id = id
        self.displayName = displayName
        self.uiFont = uiFont
    }
}

// MARK: - Static presets

public extension TerminalFont {

    // MARK: JetBrains Mono
    // Falls back to the system monospaced font when the font file is absent
    // (i.e. before T-2.12 bundles it).  Never crashes — safe for all builds.

    static let jetBrainsMono: TerminalFont = {
        let baseSize: CGFloat = 13
        // Attempt to load the named font; fall back to the system mono font.
        let font = UIFont(name: "JetBrainsMono-Regular", size: baseSize)
            ?? UIFont.monospacedSystemFont(ofSize: baseSize, weight: .regular)
        return TerminalFont(id: "jetbrains-mono", displayName: "JetBrains Mono", uiFont: font)
    }()

    // MARK: Menlo — system monospaced, always available

    static let menlo: TerminalFont = {
        let baseSize: CGFloat = 13
        // Menlo ships with iOS/macOS; fall back to the system mono if absent.
        let font = UIFont(name: "Menlo-Regular", size: baseSize)
            ?? UIFont.monospacedSystemFont(ofSize: baseSize, weight: .regular)
        return TerminalFont(id: "menlo", displayName: "Menlo", uiFont: font)
    }()

    // MARK: SF Mono — always available on iOS 13+

    static let sfMono: TerminalFont = {
        let baseSize: CGFloat = 13
        // "SFMono-Regular" is available as a named font on iOS 13+.
        let font = UIFont(name: "SFMono-Regular", size: baseSize)
            ?? UIFont.monospacedSystemFont(ofSize: baseSize, weight: .regular)
        return TerminalFont(id: "sf-mono", displayName: "SF Mono", uiFont: font)
    }()
}
