require 'filestack/config'
require 'filestack/utils/multipart_upload_utils'
require 'filestack/models/filestack_transform'
require 'filestack/utils/utils'
require 'json'

# The Filestack FilestackClient class acts as a hub for all
# Filestack actions that do not require a file handle, including
# uploading files (both local and external), initiating an external
# transformation, and other tasks
class FilestackClient
  include MultipartUploadUtils
  include UploadUtils
  attr_reader :apikey, :security

  # Initialize FilestackClient
  #
  # @param [String]               apikey        Your Filestack API key
  # @param [FilestackSecurity]    security      A Filestack security object,
  #                                             if security is enabled
  def initialize(apikey, security: nil)
    @apikey = apikey
    @security = security
  end

  # Upload a local file or external url
  # @param [String]               filepath         The path of a local file
  # @param [String]               external_url     An external URL
  # @param [Bool]                 multipart        Switch for miltipart
  #                                                    (Default: true)
  # @param [Hash]                 options          User-supplied upload options
  #
  # return [Filestack::FilestackFilelink]
  def upload(filepath: nil, external_url: nil, multipart: true, options: nil, storage: 's3', intelligent: false, timeout: 60)
    if filepath && external_url
      return 'You cannot upload a URL and file at the same time'
    end
    response = if filepath && multipart
                 multipart_upload(@apikey, filepath, @security, options, timeout, intelligent: intelligent)
               else
                 send_upload(
                   @apikey,
                   filepath: filepath,
                   external_url: external_url,
                   options: options,
                   security: @security,
                   storage: storage
                 )
               end
    FilestackFilelink.new(response['handle'], security: @security, apikey: @apikey)
  end
  # Transform an external URL 
  #
  # @param [string]    external_url   A valid URL 
  #
  # @return [Filestack::Transform]
  def transform_external(external_url)
    Transform.new(external_url: external_url, security: @security, apikey: @apikey)
  end  

  def zip(destination, files)    
    encoded_files = JSON.generate(files).gsub('"', '')
    zip_url = "#{FilestackConfig::CDN_URL}/#{@apikey}/zip/#{encoded_files}"
    escaped_zip_url = zip_url.gsub("[","%5B").gsub("]","%5D")
    response = UploadUtils.make_call(escaped_zip_url, 'get')    
    File.write(destination, response.body)
  end
end