require "json"

module Support
  module QAHelpers
    class GrassTokenHelper
      attr_accessor :db_client

      def user_grass(params = {})
        if params[:vend_contact_id]
          grass_by_vend_contact_id(params[:vend_contact_id])
        elsif params[:vendor_id]
          vend_contact_id = vend_contact_id(params[:vendor_id])
          grass_by_vend_contact_id(vend_contact_id)
        else
          raise("Provide :vend_contact_id or :vendor_id to get the grass token")
        end
      end

      def grass_by_vend_contact_id(vend_contact_id)
        vectorapi_user = vectorapi_access_token(vend_contact_id)
        grass_url = "/auth/session/?user=#{vectorapi_user['user_type']}:#{vend_contact_id}"
        grass_url += "&token=#{vectorapi_user['oauth_token']}"
        grass_url += "&client=#{vectorapi_user['client_id']}"
        JSON.parse(api_client.call(:get, grass_url).body)["token"]
      rescue => _e
        "Something went wrong when trying to get grass_token for vend_contact_id:#{vend_contact_id}"
      end

      def vectorapi_access_token(vend_contact_id)
        query = "SELECT * FROM vectorapi_access_tokens where user_id = #{vend_contact_id}"
        db_client.query(query).first
      end

      def vend_contact_id(vendor_id)
        query = "SELECT id FROM vend_contact WHERE vendor_id = #{vendor_id} and master = 'Y'"
        result = db_client.query(query).first
        if result
          result["id"]
        else
          # Maybe it's a sub account
          puts "Looking for a subaccount #{vendor_id}"
          query = "SELECT * FROM vend_contact WHERE subaccount_id = #{vendor_id} and active = 'Y'"
          result = db_client.query(query).first
          result ? result["id"] : nil
        end
      end

      private

      def db_client(db_params = {})
        @db_client ||= Support::QAHelpers::DataBase::Client.new(db_params).client
      end

      def api_client
        @api_client ||= Support::QAHelpers::API::Client.new
      end
    end
  end
end
