$KCODE='u'

require 'rubygems'
require 'recs4'
require 'date'
require 'pp'

class Item
  attr_accessor :author
  attr_accessor :date
  attr_accessor :title
  attr_accessor :asin

  def initialize(amz_result, keyalias)
    ia = amz_result[:item_attributes]
    @title = gettext(ia[keyalias[:title]])
    @author = gettext(ia[keyalias[:author]])
    @date = parseDate(gettext(ia[keyalias[:date]]))
    @asin = gettext(amz_result[:asin])
  end
  
  def gettext(var)
    if var == nil then
      ""
    else
      var.text
    end
  end
  
  def parseDate(str)
    if /\d+-\d+-\d+/ =~ str then
      d = Date.parse(str)
      Time.mktime(d.year, d.mon, d.day)
    elsif /\d+-\d+/ =~ str then
      d = Date.parse(str + "-01")
      Time.mktime(d.year, d.mon, d.day)
    else
      nil
    end
  end
  
  def to_s
    @title + " / " + @author + " / " + self.uri
  end
  
  def uri
    "http://www.amazon.co.jp/gp/product/" + @asin
  end
  
end

class AmazonService

  OPTION = {
    "Books" => {
      :search_index => "Books",
      :sort => "daterank",
      :item_page => "1",
      :response_group => "Medium"},
    "Music" => {
      :search_index => "Music",
      :sort => "-releasedate",
      :item_page => "1",
      :response_group => "Medium"},
    "DVD" => {
      :search_index => "DVD",
      :sort => "-releasedate",
      :item_page => "1",
      :response_group => "Medium"}
    }
  ALIAS = {
    "Books" => {
      :title => :title,
      :date => :publication_date,
      :author => :author},
    "Music" => {
      :title => :title,
      :date => :release_date,
      :author => :artist},
    "DVD" => {
      :title => :title,
      :date => :release_date,
      :author => :actor}
    }

  def initialize(key, target)
    @opr = RECS4::Operation.new(key, :locale => "jp")
    @target = target
  end

  def retrieve
    ret = []
    @target.each do |t|
      nt = {} # convert hash key: String -> Symbol
      t.each_key do |key|
        nt[:"#{key}"] = t[key]
      end
      op = nt.reject{|k, v| k == :keyword or k == :category}
      op.merge!(OPTION[nt[:category]])
      result = @opr.item_search(nt[:keyword], op)
      
      next if result[:items][:item] == nil
      
      result[:items][:item].each do |i|
        ret << Item.new(i, ALIAS[nt[:category]])
      end
    end
    ret
  end
  
  def future_items
    items = self.retrieve
    today = Time.now
    items.delete_if {|i| i.date < today}
  end
  
end

