module Twitter
  class Base
    extend Forwardable
    
    def_delegators :client, :get, :post
    
    attr_reader :client
    
    def initialize(client=Twitter::NoAuth.new)
      @client = client
    end
    
    # Options: since_id, max_id, count, page, since
    def friends_timeline(query={})
      perform_get('/statuses/friends_timeline.json', :query => query)
    end
    
    # Options: id, user_id, screen_name, since_id, max_id, page, since
    def user_timeline(query={})
      perform_get('/statuses/user_timeline.json', :query => query)
    end
    
    def status(id)
      perform_get("/statuses/show/#{id}.json")
    end
    
    # Options: in_reply_to_status_id
    def update(status, query={})
      perform_post("/statuses/update.json", :body => {:status => status}.merge(query))
    end
    
    # Options: since_id, max_id, since, page
    def replies(query={})
      perform_get('/statuses/replies.json', :query => query)
    end
    
    def status_destroy(id)
      perform_post("/statuses/destroy/#{id}.json")
    end
    
    # Options: id, user_id, screen_name, page
    def friends(query={})
      perform_get('/statuses/friends.json', :query => query)
    end
    
    # Options: id, user_id, screen_name, page
    def followers(query={})
      perform_get('/statuses/followers.json', :query => query)
    end
    
    def user(id=nil)
      id ? perform_get("/users/show/#{id}.json") : verify_credentials
    end
    
    # Options: since, since_id, page
    def direct_messages(query={})
      perform_get("/direct_messages.json", :query => query)
    end
    
    # Options: since, since_id, page
    def direct_messages_sent(query={})
      perform_get("/direct_messages/sent.json", :query => query)
    end
    
    def direct_message_create(user, text)
      perform_post("/direct_messages/new.json", :body => {:user => user, :text => text})
    end
    
    def direct_message_destroy(id)
      perform_post("/direct_messages/destroy/#{id}.json")
    end
    
    def friendship_create(id, follow=false)
      body = {}
      body.merge!(:follow => follow) if follow
      perform_post("/friendships/create/#{id}.json", :body => body)
    end
    
    def friendship_destroy(id)
      perform_post("/friendships/destroy/#{id}.json")
    end
    
    def friendship_exists?(a, b)
      perform_get("/friendships/exists.json", :query => {:user_a => a, :user_b => b})
    end
    
    # Options: id, user_id, screen_name
    def friend_ids(query={})
      perform_get("/friends/ids.json", :query => query)
    end
    
    # Options: id, user_id, screen_name
    def follower_ids(query={})
      perform_get("/followers/ids.json", :query => query)
    end
    
    def verify_credentials
      perform_get("/account/verify_credentials.json")
    end
    
    # Device must be sms, im or none
    def update_delivery_device(device)
      perform_post('/account/update_delivery_device.json', :body => {:device => device})
    end
    
    # One or more of the following must be present:
    #   profile_background_color, profile_text_color, profile_link_color, 
    #   profile_sidebar_fill_color, profile_sidebar_border_color
    def update_profile_colors(colors={})
      perform_post('/account/update_profile_colors.json', :body => colors)
    end
    
    def rate_limit_status
      perform_get('/account/rate_limit_status.json')
    end
    
    # One or more of the following must be present:
    #   name, email, url, location, description
    def update_profile(body={})
      perform_post('/account/update_profile.json', :body => body)
    end
    
    # Options: id, page
    def favorites(query={})
      perform_get('/favorites.json', :query => query)
    end
    
    def favorite_create(id)
      perform_post("/favorites/create/#{id}.json")
    end
    
    def favorite_destroy(id)
      perform_post("/favorites/destroy/#{id}.json")
    end
    
    def enable_notifications(id)
      perform_post("/notifications/follow/#{id}.json")
    end
    
    def disable_notifications(id)
      perform_post("/notifications/leave/#{id}.json")
    end
    
    def block(id)
      perform_post("/blocks/create/#{id}.json")
    end
    
    def unblock(id)
      perform_post("/blocks/destroy/#{id}.json")
    end
    
    def help
      perform_get('/help/test.json')
    end
    
    private
      def perform_get(path, options={})
        Twitter::Request.get(self, path, options)
      end
      
      def perform_post(path, options={})
        Twitter::Request.post(self, path, options)
      end
  end
end