module Twitter
  module Rails
    module Controller
      def self.included?(controller)
        controller.helper_method :twitter_session, :logged_in_via_twitter?
      end

      protected
      def twitter_session
        @twitter_session
      end

      def create_twitter_session
        request_access_token if request_token_available?

        if access_token_available?
          twitter_oauth.authorize_from_access(session[:twitter_atoken], session[:twitter_asecret])
          @twitter_session = Twitter::Base.new(twitter_oauth)
        end
      end

      def logged_in_via_twitter?
        !!twitter_session
      end

      def create_twitter_session_from_user_tokens(user=current_user)
        if user && !logged_in_via_twitter? && user.twitter_atoken && user.twitter_asecret
          twitter_oauth.authorize_from_access(user.twitter_atoken, user.twitter_asecret)
          twitter_session = Twitter::Base.new(twitter_oauth)
        end
      end

      def clear_twitter_session_information
        session[:twitter_atoken] = nil
        session[:twitter_asecret] = nil
      end

      def clear_user_twitter_tokens(user=current_user)
        user.update_attributes(:twitter_atoken => nil,
                               :twitter_asecret => nil)
      end

      def request_access_token
        begin
          oauth = self.twitter_oauth
          oauth.authorize_from_request(session[:twitter_rtoken], session[:twitter_rsecret])

          session[:twitter_atoken] = oauth.access_token.token
          session[:twitter_asecret] = oauth.access_token.secret
        rescue ::OAuth::Unauthorized
        ensure
          session[:twitter_rtoken] = nil
          session[:twitter_rsecret] = nil
        end
      end

      def request_token_available?
        session[:twitter_rtoken] && session[:twitter_rsecret]
      end

      def access_token_available?
        session[:twitter_atoken] && session[:twitter_asecret]
      end

      def twitter_oauth
        @twitter_oauth ||= Twitter::OAuth.new(ENV['TWITTER_CONSUMER_TOKEN'], ENV['TWITTER_CONSUMER_SECRET'])
      end
    end
  end
end