@testable import BrewBar
import XCTest

final class BrewParserTests: XCTestCase {
    // MARK: - parseOutdatedJSON

    func testParseOutdatedJSON_formulaeAndCasks() {
        let output = """
        {
          "formulae": [
            {
              "name": "wget",
              "installed_versions": ["1.21.3"],
              "current_version": "1.21.4",
              "pinned": false,
              "pinned_version": null
            }
          ],
          "casks": [
            {
              "name": "tailscale-app",
              "installed_versions": ["1.98.5"],
              "current_version": "1.98.8",
              "pinned": false,
              "pinned_version": null
            }
          ]
        }
        """

        let result = BrewParser.parseOutdatedJSON(output)
        XCTAssertEqual(result.formulae.map(\.name), ["wget"])
        XCTAssertEqual(result.casks.map(\.name), ["tailscale-app"])
        XCTAssertEqual(result.count, 2)
        XCTAssertFalse(result.isEmpty)
        XCTAssertEqual(result.all.map(\.name), ["wget", "tailscale-app"])
    }

    func testParseOutdatedJSON_nothingOutdated() {
        let result = BrewParser.parseOutdatedJSON("{\"formulae\": [], \"casks\": []}")
        XCTAssertTrue(result.isEmpty)
        XCTAssertEqual(result.count, 0)
    }

    func testParseOutdatedJSON_invalidInputReturnsNone() {
        XCTAssertEqual(BrewParser.parseOutdatedJSON(""), .none)
        XCTAssertEqual(BrewParser.parseOutdatedJSON("Error: some brew failure"), .none)
    }

    func testParseOutdatedJSON_packageLabel() {
        let package = OutdatedPackage(name: "wget", installedVersions: ["1.21.3"], currentVersion: "1.21.4")
        XCTAssertEqual(package.label, "wget 1.21.3 → 1.21.4")
    }

    // MARK: - parseVersion

    func testParseVersion_picksFirstLine() {
        let output = "Homebrew 4.3.0\nHomebrew/homebrew-core (git revision abc123)\n"
        XCTAssertEqual(BrewParser.parseVersion(output), "Homebrew 4.3.0")
    }

    func testParseVersion_emptyOutput() {
        XCTAssertEqual(BrewParser.parseVersion(""), "Unknown")
    }

    func testParseVersion_singleLine() {
        XCTAssertEqual(BrewParser.parseVersion("Homebrew 4.3.0"), "Homebrew 4.3.0")
    }
}
