//
// Copyright (c) Double Symmetry GmbH
// Commercial use requires a license. See https://rntp.dev/pricing
//

import XCTest
@testable import PlayerCore

final class ICYMetadataParserTests: XCTestCase {

  func testTitleArtistSplit() {
    let md = ICYMetadataParser.streamMetadata(from: "StreamTitle='Artist - Song';")
    XCTAssertEqual(md?.title, "Song")
    XCTAssertEqual(md?.artist, "Artist")
  }

  func testTitleNoSeparator() {
    let md = ICYMetadataParser.streamMetadata(from: "StreamTitle='Talk show';")
    XCTAssertEqual(md?.title, "Talk show")
    XCTAssertNil(md?.artist)
  }

  func testStreamUrlToArtwork() {
    let md = ICYMetadataParser.streamMetadata(from: "StreamTitle='X';StreamUrl='http://a/art.jpg';")
    XCTAssertEqual(md?.artworkUri, "http://a/art.jpg")
    XCTAssertEqual(md?.title, "X")
  }

  func testEmptyStreamUrlIgnored() {
    let md = ICYMetadataParser.streamMetadata(from: "StreamTitle='X';StreamUrl='';")
    XCTAssertNil(md?.artworkUri)
    XCTAssertEqual(md?.title, "X")
  }

  func testEmbeddedSemicolonNotTruncated() {
    let md = ICYMetadataParser.streamMetadata(from: "StreamTitle='Song A; live encore';")
    XCTAssertEqual(md?.title, "Song A; live encore")
    XCTAssertNil(md?.artist)
  }

  func testEmbeddedQuoteNotTruncated() {
    let md = ICYMetadataParser.streamMetadata(from: "StreamTitle='Blur - Song 2 (12'' mix)';")
    XCTAssertEqual(md?.artist, "Blur")
    XCTAssertEqual(md?.title, "Song 2 (12'' mix)")
  }

  func testBlankReturnsNil() {
    XCTAssertNil(ICYMetadataParser.streamMetadata(from: "StreamTitle='';"))
  }

  func testFinalFieldWithoutTrailingSemicolon() {
    let md = ICYMetadataParser.streamMetadata(from: "StreamTitle='Solo'")
    XCTAssertEqual(md?.title, "Solo")
  }

  func testKeyMatchIsCaseInsensitive() {
    // parseTimedMetadata matches via key.lowercased(); mirror that so any casing works.
    let lower = ICYMetadataParser.streamMetadata(from: "streamtitle='Artist - Song';")
    XCTAssertEqual(lower?.title, "Song")
    XCTAssertEqual(lower?.artist, "Artist")

    let upper = ICYMetadataParser.streamMetadata(
      from: "STREAMTITLE='X';STREAMURL='http://a/art.jpg';")
    XCTAssertEqual(upper?.title, "X")
    XCTAssertEqual(upper?.artworkUri, "http://a/art.jpg")
  }

  func testEmbeddedKeyInValueDoesNotHijackRealField() {
    // A literal StreamUrl='...' inside the title value must not shadow the real field.
    let md = ICYMetadataParser.streamMetadata(
      from: "StreamTitle='See StreamUrl='http://spam.example/x.jpg' now';StreamUrl='http://real.example/art.jpg';")
    XCTAssertEqual(md?.artworkUri, "http://real.example/art.jpg")
  }
}
