module RbtcArbitrage
  module Clients
    class BtceClient
      include RbtcArbitrage::Client

      def exchange
        :btce
      end

      def balance
        return @balance if @balance
        begin
          balances = interface.get_info["return"]["funds"]
          @balance = [balances["btc"], balances["usd"]]
        rescue NoMethodError => e
          raise SecurityError, "Invalid API key for BTC-e"
        end
      end

      def interface
      end

      def validate_env
        validate_keys :btce_key, :btce_secret, :btce_address
      end

      def trade action
        warning = "BTC-E does not support API bitcoin transfer. "
        warning << "If you really want to trade, you will have "
        warning << "to manually send bitcoin. Enter 'accept' to continue. \n> "
        @options[:logger].warn warning if @options[:verbose]
        return false unless gets.chomp == "accept"
        opts = {
          type: action,
          rate: price(action),
          amount: @options[:volume],
          pair: "btc_usd"
        }
        interface.trade opts
      end

      def price action
        return @ticker[action.to_s] if @ticker
        @ticker = Btce::Ticker.new("btc_usd").json["ticker"]
        @ticker[action.to_s]
      end

      def transfer client
        if @options[:verbose]
          error = "BTC-E does not have a 'transfer' API.\n"
          error << "You must transfer bitcoin manually."
          @options[:logger].error error
        end
      end

      def interface
        opts = {key: ENV['BTCE_KEY'], secret: ENV['BTCE_SECRET']}
        @interface ||= Btce::TradeAPI.new(opts)
      end
    end
  end
end