lib/elelem/tui.rb



# frozen_string_literal: true

module Elelem
  class TUI
    attr_reader :stdin, :stdout

    def initialize(stdin = $stdin, stdout = $stdout)
      @stdin = stdin
      @stdout = stdout
    end

    def prompt(message)
      Reline.readline(message, true)
    end

    def say(message, colour: :default, newline: false)
      if newline
        stdout.puts(colourize(message, colour: colour))
      else
        stdout.print(colourize(message, colour: colour))
      end
      stdout.flush
    end

    def show_progress(message, icon = ".", colour: :gray)
      timestamp = Time.now.strftime("%H:%M:%S")
      say("\n[#{icon}] #{timestamp} #{message}", colour: colour, newline: true)
    end

    def clear_line
      say("\r#{" " * 80}\r", newline: false)
    end

    def complete_progress(message = "Completed")
      clear_line
      show_progress(message, "✓", colour: :green)
    end

    private

    def colourize(text, colour: :default)
      case colour
      when :black
        "\e[30m#{text}\e[0m"
      when :red
        "\e[31m#{text}\e[0m"
      when :green
        "\e[32m#{text}\e[0m"
      when :yellow
        "\e[33m#{text}\e[0m"
      when :blue
        "\e[34m#{text}\e[0m"
      when :magenta
        "\e[35m#{text}\e[0m"
      when :cyan
        "\e[36m#{text}\e[0m"
      when :white
        "\e[37m#{text}\e[0m"
      when :gray
        "\e[90m#{text}\e[0m"
      else
        text
      end
    end
  end
end