require 'open-uri'

class NeopetsUser
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :username
  attr_reader :hangers

  def initialize(app_user)
    @app_user = app_user
  end

  def load!
    doc = Nokogiri::HTML(open(url))

    unless pets_wrapper = doc.at('#userneopets')
      raise NotFound, "Could not find user #{username}"
    end

    pets = pets_wrapper.css('a[href^="/petlookup.phtml"]').map do |link|
      name = link['href'].split('=').last
      Pet.find_or_initialize_by_name(name)
    end

    items = pets.each(&:load!).map(&:items).flatten
    item_ids = items.map(&:id)

    existing_hanger_item_ids = @app_user.closet_hangers.select(:item_id).where(:item_id => item_ids).map(&:item_id)

    @hangers = []
    items.each do |item|
      next if existing_hanger_item_ids.include?(item.id)
      hanger = @app_user.closet_hangers.build
      hanger.item = item
      hanger.quantity = 1
      @hangers << hanger
    end
  end

  def save_hangers!
    ClosetHanger.transaction { @hangers.each(&:save!) }
  end

  def persisted?
    false
  end

  protected

  URL_PREFIX = 'http://www.neopets.com/userlookup.phtml?user='
  def url
    URL_PREFIX + @username
  end

  class NotFound < RuntimeError;end
end