require 'blinkenlights'

class BlinkenLights::Windows < BlinkenLights

  WINDOWS_LEDS = { LED_SCR => 0x91, LED_NUM => 0x90, LED_CAP => 0x14 }
  WIN_KEY_UP = 0x26

  GetKeyState = Win32API.new("user32", "GetKeyState", ["i"], "i")
  Keybd_event = Win32API.new("user32", "keybd_event", %w[i i i i], "v")

  def initialize(ignored = nil, delay = DEF_DELAY)
    @tty = File.open("NUL")
    @delay = delay
    @old_leds = get
  end

  def get
    WINDOWS_LEDS.inject(0) do |sum, (nix, win)|
      sum | ((GetKeyState.call(win) != 0) ? nix : 0)
    end
  end

  def set(number)
    WINDOWS_LEDS.each do |nix, win|
      if (number & nix != 0) ^ (GetKeyState.call(win) != 0)
        Keybd_event.call(win, 0, 0, 0)
        Keybd_event.call(win, 0, WIN_KEY_UP, 0)
      end
    end
    sleep @delay
    number
  end
end

class BlinkenLights
  def self.new(*args)
    super
  rescue Errno::ENOENT
    BlinkenLights::Windows.new(*args)
  end
end
