#!/usr/bin/env ruby

require 'optparse'
require 'irb'

require_relative "../lib/ask_chatgpt"

AskChatgpt.setup do |config|
  config.included_prompts = []
end

options = {}

parser = OptionParser.new do |opts|
  opts.banner = <<-USAGE
    Usage: ask_chatgpt [options]"

    Make sure you have set OPENAI_API_KEY environment variable.
    You can put it in your ~/.bashrc, ~/.bash_profile, ~/.zshrc file or using plenty of other options.

    Examples:
      ask_chatgpt -q "How to parse JSON file in Ruby?"
      ask_chatgpt -t 0.5 -q "How to parse JSON file in Ruby?"
      ask_chatgpt -m gpt-4 -q "How to parse JSON file in Ruby?"
      ask_chatgpt -f app/models/user.rb -q "find a bug in this Rails model"
      ask_chatgpt -f app/models/user.rb -q "create RSpec spec for this model"
      ask_chatgpt -f test/dummy/Gemfile -q "sort Ruby gems alphabetically"
      ask_chatgpt -s 1"

    To specify model you can use shorter version: -m 4, -m 4.0, -m 3.5.

    Version: #{AskChatGPT::VERSION}

  USAGE

  opts.on("-q", "--question \"Your Prompt\"", String, "Specify your prompt with full context, language, etc.") do |prompt|
    options[:prompt] = prompt
  end

  opts.on("-s", "--speak AudioDeviceID", String, "Specify audio device ID") do |audio_device_id|
    options[:audio_device_id] = audio_device_id
  end

  opts.on("-f", "--file FILE", String, "Specify file with prompt") do |file|
    options[:file_path] = file
  end

  opts.on("-m", "--model MODEL", String, "Specify the ChatGPT model. Uses \"gpt-3.5-turbo\" by default") do |model|
    options[:model] = model
  end

  opts.on("-t", "--temperature 0.7", String, "Specify a temperature. Uses \"#{AskChatGPT.temperature}\" by default") do |temperature|
    options[:temperature] = temperature
  end

  opts.on("-d", "--debug", "Output request/response") do |debug|
    options[:debug] = true
  end

  opts.on("-h", "--help", "Prints this help") do
    puts opts
    exit
  end
end

parser.parse!

AskChatGPT.debug = !!options[:debug]

if options[:model].present?
  model = options[:model].to_s
  disctionary = {
    "4" => "gpt-4",
    "4.0" => "gpt-4",
    "40" => "gpt-4",
    "3.5t" => "gpt-3.5-turbo",
    "3.5" => "gpt-3.5-turbo",
    "35" => "gpt-3.5-turbo",
  }
  model = disctionary[model.downcase] || model
  AskChatGPT.model = model
end

options[:prompt] = ARGV.join(" ") if options[:prompt].blank?

if options[:prompt].blank? &&  options[:audio_device_id].blank?
  puts parser
  exit
end

include AskChatGPT::Console

if options[:temperature].present?
  AskChatGPT.temperature = options[:temperature].to_f
end

if options[:audio_device_id].present?
  AskChatGPT.voice_enabled = true
  AskChatGPT.voice_max_duration = 20
  AskChatGPT.audio_device_id = options[:audio_device_id]

  instance = gpt.speak
else
  instance = gpt.ask(options[:prompt])
  instance = instance.payload(File.read(options[:file_path])) if options[:file_path].present?

  puts instance.inspect
end
