class Quandl::Command::Tasks::Schedule < Quandl::Command::Task
  
  autoload_quandl_client
  authenticated_users_only!
  
  description "Schedule a script to be run in the quandl cloud."
  syntax %{quandl schedule command [file]

  COMMANDS:
  
    schedule list
    schedule add       file
    schedule show      file
    schedule delete    file
    schedule replace   file
    
  EXAMPLES:
  
    $ quandl schedule add scraper.rb
    You have successfully scheduled scraper.rb to be run daily.

    $ quandl schedule add scraper.rb --name weekly_scraper.rb --frequency weekly
    You have successfully scheduled weekly-scraper.rb to be run weekly.
  
    $ quandl schedule replace scraper.rb
    You have successfully replace scraper.rb}
    
  options({
    String => {
      name:            "The name used to reference your scraper in the quandl cloud.",
      frequency:       "How often the scraper should be run. [ daily, weekly, monthly, quaterly, annually ]",
    }
  })
  
  def list
    present(scrapers)
  end
  
  def show
    present(scraper)
  end
  
  def add
    Quandl::Client::Scraper.create( name: name, scraper: args.first )
    info("'#{scraper.name}' was added.")
    info("#{schedule_message}")
  end
  
  def download
    begin
      require 'open-uri'
      open( scraper.name, 'wb') do |file|
        $stdout << open(scraper.scraper_url).read
      end
    rescue => err
      present err
    end
  end
  
  def delete
    (info("'#{name}' does not exist "); return;) if scraper.blank?
    info("You are about to delete '#{scraper.name}'")
    return unless confirmed?
    scraper.destroy if scraper.respond_to?(:destroy)
    info("'#{scraper.name}' was deleted")
  end


  def replace
    (info("'#{name}' does not exist "); return;) if scraper.blank?
    info("You are about to replace '#{scraper.name}'")
    return unless confirmed?
    scraper.destroy if scraper.respond_to?(:destroy)
    Quandl::Client::Scraper.create( name: name, scraper: args.first )
    info("'#{scraper.name}' was replaced.")
    info("#{schedule_message}")
  end
  
  private

  def schedule_message
    "It will run 3 times a day starting immediately. Check your scrapers run status at #{quandl_url.gsub(/\/api\/?/,'')}/scrapers"
  end

  def scrapers
    @scrapers ||= Quandl::Client::Scraper.where( page: page ).fetch
  end
  
  def scraper
    defined?(@scraper) ? @scraper : ( @scraper = find_scraper )
  end
  
  def find_scraper
    return nil unless args.first.present?
    # if the arg is numeric lookup the id. otherwise search for a scraper by name and grab the id
    id = args.first.numeric? ? args.first : Quandl::Client::Scraper.where( name: name ).try(:first).try(:id)
    # find the scraper with the id
    Quandl::Client::Scraper.find(id) unless id.nil?
  end
  
  def name
    return options.name if options.name.present?
    return File.basename(args.first) if args.first.present?
  end
  
end