# -*- coding: utf-8 -*-
# Copyright 2008-2010, Felspar Co Ltd. http://fost.3.felspar.com/
# Distributed under the Boost Software License, Version 1.0.
# See accompanying file LICENSE_1_0.txt or copy at
#     http://www.boost.org/LICENSE_1_0.txt
import Fost.settings
from Fost.internet._internet import ua_request, url, user_agent
from Fost.json import parse, unparse


fostsettings = Fost.settings.database()


class agent(user_agent):
    def __init__(self, base = None):
        super(agent, self).__init__(
            base or url('http://felspar-appservices.appspot.com/')
            #base or url('http://felspar-appservices-test.appspot.com/')
            #base or url('http://localhost:6789/')
        )

    def _auto_retry(self, request):
        response_body = None
        parsed_response = None
        for attempt in range(3):
            try:
                response = self(request)
                response_body = response.body
                parsed_response = parse(response_body)
            except Exception:
                # network or appengine problem, may be a FOSTLib exception
                import time
                seconds = 3*(attempt+1)
                print "*** Waiting", seconds, "seconds"
                time.sleep(seconds)
            else:
                break
        return response, parsed_response or parse(response_body)

    def delete(self, url):
        response = self(ua_request('DELETE', self.base(url)))
        return response, parse(response.body)

    def get(self, url):
        base_url = self.base(url)
        request = ua_request("GET", base_url)
        return self._auto_retry(request)

    def post(self, url, body, idempotent=False):
        request = ua_request("POST", self.base(url), unparse(body, False))
        if idempotent:
            return self._auto_retry(request)
        else:
            response = self(request)
            return response, parse(response.body)

    def put(self, url, body):
        response = self(ua_request("PUT", self.base(url), unparse(body, False)))
        return response, parse(response.body)
