module Savio
  RgbColor = Struct.new(:r, :g, :b) do
    def self.newFromHSV(hsv)
      rgb = hsv.to_rgb()
      return RgbColor.new(rgb.r,rgb.g,rgb.b)
    end
    def to_hsv()
      max = [r, g, b].max
      min = [r, g, b].min
      delta = max - min
      v = max

      if (max != 0.0)
        s = delta / max
      else
        s = 0.0
      end

      if (s == 0.0)
        h = 0.0
      else
        if (r == max)
          h = 0 + (g - b) / delta
        elsif (g == max)
          h = 2 + (b - r) / delta
        elsif (b == max)
          h = 4 + (r - g) / delta
        end

        h *= 60.0

        if (h < 0)
          h += 360.0
        end
      end
      return HsvColor.new(h,s,v)
    end
  end
  HsvColor = Struct.new(:h, :s, :v) do
    def self.newFromRGB(rgb)
      hsv = rgb.to_hsv()
      return HsvColor.new(hsv.h,hsv.s,hsv.v)
    end
    def to_rgb()
      hue = h.to_f
      saturation = s.to_f
      value = v.to_f

      chroma = (value * saturation).to_f
      hPrime = hue/60.0
      x = (chroma * (1 - (hPrime % 2 - 1).abs)).to_f

      if 0 <= hPrime && hPrime < 1
        rgb = [chroma, x, 0]
      elsif 1 <= hPrime && hPrime < 2
        rgb = [x, chroma, 0]
      elsif 2 <= hPrime && hPrime < 3
        rgb = [0, chroma, x]
      elsif 3 <= hPrime && hPrime < 4
        rgb = [0, x, chroma]
      elsif 4 <= hPrime && hPrime < 5
        rgb = [x, 0, chroma]
      elsif 5 <= hPrime && hPrime < 6
        rgb = [chroma, 0, x]
      else
        rgb = [0,0,0]
      end

      match = (value - chroma).to_f

      rgb[0] = (rgb[0] + match).to_f
      rgb[1] = (rgb[1] + match).to_f
      rgb[2] = (rgb[2] + match).to_f

      return RgbColor.new(rgb[0],rgb[1],rgb[2])
    end
  end
end