require "semantic_version"

module CrystalGauntlet::Versions
  extend self

  def parse(game_version : String) : SemanticVersion
    n = game_version.to_i
    case n
    when (1..7).includes?(n)
      SemanticVersion.new(1, n - 1, 0)
    when 10
      SemanticVersion.new(1, 7, 0)
    else
      SemanticVersion.new(game_version[0].to_i? || 0, game_version[1].to_i? || 0, game_version[2..].to_i? || 0)
    end
  end

  def parse_binary(binary_version : String) : SemanticVersion
    n = binary_version.to_i
    # these aren't 100% accurate because binary_version
    # doesn't fully represent the version early on
    case n
    when 0
      SemanticVersion.new(1, 0, 0)
    when 1
      SemanticVersion.new(1, 1, 0)
    when 2
      SemanticVersion.new(1, 2, 0)
    when 3
      SemanticVersion.new(1, 3, 0)
    when 5
      SemanticVersion.new(1, 4, 0)
    when 6
      SemanticVersion.new(1, 5, 0)
    when 7
      SemanticVersion.new(1, 6, 0)
    when 10
      SemanticVersion.new(1, 7, 0)
    when 11
      SemanticVersion.new(1, 7, 1)
    when 12
      SemanticVersion.new(1, 8, 0)
    when 13
      SemanticVersion.new(1, 8, 1)
    when 14
      SemanticVersion.new(1, 8, 11)
    when 20
      SemanticVersion.new(1, 9, 0)
    when 24
      SemanticVersion.new(1, 9, 2)
    when 25
      SemanticVersion.new(1, 9, 3)
    when 27
      SemanticVersion.new(2, 0, 0)
    when 28
      SemanticVersion.new(2, 0, 1)
    when 29
      SemanticVersion.new(2, 0, 10)
    when 33
      SemanticVersion.new(2, 1, 0)
    when 34
      SemanticVersion.new(2, 1, 1)
    when 35
      SemanticVersion.new(2, 1, 13)
    else
      SemanticVersion.new(2, 1, 13)
    end
  end

  # shorthands because i hate typing 3 words for this
  V1_0 = SemanticVersion.new(1, 0, 0)
  V1_1 = SemanticVersion.new(1, 1, 0)
  V1_2 = SemanticVersion.new(1, 2, 0)
  V1_3 = SemanticVersion.new(1, 3, 0)
  V1_4 = SemanticVersion.new(1, 4, 0)
  V1_5 = SemanticVersion.new(1, 5, 0)
  V1_6 = SemanticVersion.new(1, 6, 0)
  V1_7 = SemanticVersion.new(1, 7, 0)
  V1_8 = SemanticVersion.new(1, 8, 0)
  V1_9 = SemanticVersion.new(1, 9, 0)
  V2_0 = SemanticVersion.new(2, 0, 0)
  V2_1 = SemanticVersion.new(2, 1, 0)
  V2_11 = SemanticVersion.new(2, 1, 1)
  V2_2 = SemanticVersion.new(2, 2, 0)
end
