class SlackSmartBot
  module Commands
    module General
      module AI
        module OpenAI
          def open_ai_generate_image(message, delete_history = false, repeat: false)
            save_stats(__method__)
            get_personal_settings()
            @ai_open_ai, message_connect = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, reconnect: delete_history, service: :dall_e)
            respond message_connect if message_connect
            user = Thread.current[:user].dup
            team_id = user.team_id 
            team_id_user = Thread.current[:team_id_user]

            if !@ai_open_ai[team_id_user].nil? and !@ai_open_ai[team_id_user][:dall_e][:client].nil?
              @ai_open_ai_image ||= {}
              @ai_open_ai_image[team_id_user] ||= []
              react :art
              begin
                @ai_open_ai_image[team_id_user] = [] if delete_history
                if delete_history and message == ""
                  respond "*OpenAI*: Let's start a new image generation. Use `?i PROMPT` to generate an image."
                elsif repeat and @ai_open_ai_image[team_id_user].empty? and message == ""
                  respond "*OpenAI*: Sorry, I need to generate an image first. Use `?i PROMPT` to generate an image."
                else
                  @ai_open_ai_image[team_id_user] << message unless repeat
                  success, res = SlackSmartBot::AI::OpenAI.send_image_generation(@ai_open_ai[team_id_user][:dall_e][:client], @ai_open_ai_image[team_id_user].join("\n"), @ai_open_ai[team_id_user][:dall_e][:image_size])
                  if success
                    urls = res
                    urls = [urls] if urls.is_a?(String)
                    urls.delete({})
                    if urls.nil? or urls.empty?
                      respond "*OpenAI*: Sorry, I'm having some problems. OpenAI was not able to generate an image."
                    else
                      session_name = @ai_open_ai_image[team_id_user].first[0..29]
                      messagersp = "OpenAI Session: _<#{session_name}...>_ (id:#{@ai_open_ai_image[team_id_user].object_id})"
                      message = "Repeat" if repeat
                      require "uri"
                      urls.each do |url|
                        uri = URI.parse(url)
                        require "nice_http"
                        http = NiceHttp.new(host: "https://#{uri.host}")
                        Dir.mkdir("#{config.path}/tmp") unless Dir.exist?("#{config.path}/tmp")
                        file_path_name = "#{config.path}/tmp/#{team_id_user}_#{@ai_open_ai_image[team_id_user].object_id}.png"
                        res = http.get(uri.path + "?#{uri.query}", save_data: file_path_name)
                        if config.simulate
                          respond "file: #{file_path_name}, #{messagersp}, #{message}, image/png, png"
                        else
                          send_file(Thread.current[:dest], messagersp, file_path_name, message, "image/png", "png")
                        end
                        http.close unless http.nil?
                      end
                    end
                  else
                    respond res
                  end
                end
              rescue => exception
                respond "*OpenAI*: Sorry, I'm having some problems. OpenAI probably is not available. Please try again later."
                @logger.warn exception
              end
              unreact :art
            end
          end
        end
      end
    end
  end
end