# frozen_string_literal: true

require "parslet"
module Unitsml
  class Transform < Parslet::Transform
    rule(sqrt: simple(:sqrt))       { Sqrt.new(sqrt) }
    rule(units: simple(:unit))      { Unit.new(unit.to_s) }
    rule(prefixes: simple(:prefix)) { Prefix.new(prefix.to_s) }
    rule(dimensions: simple(:dimension)) { Dimension.new(dimension.to_s) }

    rule(units: simple(:unit),
         integer: simple(:integer)) do
      Unit.new(unit.to_s, integer.to_s)
    end

    rule(dimensions: simple(:dimension),
         integer: simple(:integer)) do
      Dimension.new(dimension.to_s, integer.to_s)
    end

    rule(prefixes: simple(:prefix),
         units: simple(:unit)) do
      Unit.new(unit.to_s, prefix: Prefix.new(prefix.to_s))
    end

    rule(prefixes: simple(:prefix),
         units: simple(:unit),
         integer: simple(:integer)) do
      prefix_obj = Prefix.new(prefix.to_s)
      Unit.new(unit.to_s, integer.to_s, prefix: prefix_obj)
    end

    rule(prefixes: simple(:prefix),
         units: simple(:unit),
         integer: simple(:integer),
         extender: simple(:extender),
         sequence: simple(:sequence),) do
      prefix_obj = Prefix.new(prefix.to_s)
      unit_object = Unit.new(unit.to_s, integer.to_s, prefix: prefix_obj)
      Formula.new(
        [
          unit_object,
          Extender.new(extender.to_s),
          sequence,
        ],
      )
    end

    rule(prefixes: simple(:prefix),
         units: simple(:unit),
         extender: simple(:extender),
         sequence: simple(:sequence)) do
      Formula.new(
        [
          Unit.new(unit.to_s, prefix: Prefix.new(prefix.to_s)),
          Extender.new(extender.to_s),
          sequence,
        ],
      )
    end

    rule(units: simple(:unit),
         extender: simple(:extender),
         sequence: simple(:sequence)) do
      Formula.new(
        [
          Unit.new(unit.to_s),
          Extender.new(extender.to_s),
          sequence,
        ],
      )
    end

    rule(units: simple(:unit),
         integer: simple(:integer),
         extender: simple(:extender),
         sequence: simple(:sequence)) do
      Formula.new(
        [
          Unit.new(unit.to_s, integer.to_s),
          Extender.new(extender.to_s),
          sequence,
        ],
      )
    end

    rule(dimensions: simple(:dimension),
         extender: simple(:extender),
         sequence: simple(:sequence)) do
      Formula.new(
        [
          Dimension.new(dimension.to_s),
          Extender.new(extender.to_s),
          sequence,
        ],
      )
    end

    rule(dimensions: simple(:dimension),
         integer: simple(:integer),
         extender: simple(:extender),
         sequence: simple(:sequence)) do
      Formula.new(
        [
          Dimension.new(dimension.to_s, integer.to_s),
          Extender.new(extender.to_s),
          sequence,
        ],
      )
    end
  end
end