module ZencoderAPI #:nodoc:


  # This class implements a couple of bogus recipes, mainly as an example of usage. Recipe isntances can be passed in to Zencoder#submit_job
  class Recipe
    @@keys = [:label, :base_url, :filename, :width, :height, :quality, :speed, 
      :upscale, :stretch, :frame_rate, :max_frame_rate, :keyframe_interval, 
      :video_bitrate, :bitrate_cap, :buffer_size, :h264_profile, :h264_level, 
      :skip_video, :audio_codec, :audio_bitrate, :audio_channels, :audio_sample_rate, 
      :skip_audio, :start_clip, :clip_length, :thumbnails, :notifications]

    @@thumb_keys = [:number, :size, :base_url, :prefix]

    # constructor. accepts a name for the recipe, and a hash of params. The constructor will try to verify that you aren't doing
    # something it doesn't know about, though does no further validation.
    def initialize(name, params )
      params = params.inject(Hash.new) do |m,v|
        m[v.first.to_s.to_sym]=v.last
        m
      end
      raise RecipeError.new("no recipe parameters?") if params.empty?
      raise RecipeError.new("unknown recipe parameter #{params.keys - @@keys}") unless (params.keys - @@keys).empty?
      if params[:thumbnails]
        raise RecipeError.new("unknown thumb keys #{params[:thumbnails].keys - @@thumb_keys}") if (params[:thumbnails].keys - @@thumb_keys).empty?
      end
      @o = params
    end


    def to_json #:nodoc:
      @o.to_json
    end
  end

  # Raised if something goes wrong with a recipe configuration
  class RecipeError < Exception; end

  # Some example recipes.
  module Recipes
    #A sample iphone recipe. if you have a better one, send me a patch.
    def self.iphone(params={})
      raise "Base_url unset." unless params['base_url']
      defaults = { 
        "label"=> "iphone",
        "width"=> 240,
        "frame_rate"=> 24,
        "max_frame_rate"=> 24,
        "video_bitrate"=> 40,
        "bitrate_cap"=> 100
      }

      params = defaults.merge(params)

      Recipe.new(:iphone, params)
    end
    
    # A sample web recipe. if you have a better one, send me a patch.
    def self.web(params={})
      raise "Base_url unset." unless params['base_url']
      defaults = { 
        "label"=> "web",
        "width"=> 240,
        "frame_rate"=> 24,
        "max_frame_rate"=> 24,
        "video_bitrate"=> 40,
        "bitrate_cap"=> 100
      }
      params = defaults.merge(params)

       Recipe.new(:web, params)
    end
  end
end