from django.contrib.auth.models import User

from piston.handler import BaseHandler
from piston.utils import rc

from eve_api.models import EVEAccount, EVEPlayerCharacter
from eve_proxy.models import CachedDocument


class V2AuthenticationHandler(BaseHandler):
    """
    Authenticate a user against the Auth user DB.
    Provides back a session allowing further access
    """

    allowed_methods = ('GET')

    def read(self, request, username, password):
        """
        Validates login details for the provided user as
        long as 'username' and 'password' are provided.
        """

        try:
            user = User.object.get(username=username)
        except User.DoesNotExist:
            resp = rc.NOT_FOUND
            resp.write({'auth': 'notfound'})
            return resp

        if password and password == user.get_profile().api_service_password:
            return {'userid': user.id, 
                    'username': user.username,
                    'email': user.email,
                    'groups': user.groups.all().values('id', 'name'),
                    'staff': user.is_staff,
                    'superuser': user.is_superuser}

        resp = rc.FORBIDDEN
        resp.write({'auth': 'failed'})
        return resp


class V2EveAPIProxyHandler(BaseHandler):
    """
    Provides a proxy handler to the EVE API using 'eve_proxy'
    """

    allowed_methods = ('GET')

    def read(self, request):
        """
        Acts as a EVE API proxy, all params are passed to the
        API, for the exception of 'apikey' which is dervived from the
        stored information and 'userid'

        'apikey' field should be populated with the Auth API key.
        """
        url_path = request.META['PATH_INFO'].url_path.replace(reverse('v2-api-eveapiproxy'), "/")

        params = {}
        for key, value in request.GET.items():
            params[key.lower()] = value

        try:
            userid = request.GET.get('userid', None)
            obj = EVEAccount.objects.get(api_user_id=userid)
            params['apikey'] = obj.api_key
        except EVEAccount.DoesNotExist:
            pass

        try:
            cached_doc = CachedDocument.objects.api_query(url_path, params)
        except DocumentRetrievalError:
            return HttpResponse(status=500)
        else:
            return HttpResponse(cached_doc.body)


class V2UserHandler(BaseHandler):
    allowed_methods = ('GET')

    def read(self, request, userid):
        try:
            u = User.objects.get(id=userid)
        except (User.DoesNotExist, ValueError):
            resp = rc.NOT_FOUND

        charlist = []
        for acc in u.eveaccount_set.all():
            for char in acc.characters.all().select_related('characters').values('id', 'name', 'corporation', 'corporation_date', 'corporation__name'):
                d = dict(char)
                d['eveaccount'] = acc.id
                charlist.append(d)

        d = {'id': u.id,
             'username': u.username,
             'email': u.email,
             'eveaccounts': u.eveaccount_set.all().values('api_user_id', 'description', 'api_status', 'api_keytype'),
             'serviceaccounts': u.serviceaccount_set.all().values('service', 'service__name', 'service__api', 'service_uid'),
             'characters': charlist,
             'groups': u.groups.all().values('id', 'name'),
             'staff': u.is_staff,
             'superuser': u.is_superuser}

        return d


@@ -434,31 +434,11 @@
 uest
-, username, password
 ):%0A
+
     
@@ -558,16 +558,16 @@
 ovided.%0A
-
         
@@ -567,24 +567,207 @@
        %22%22%22%0A%0A
+        username = request.GET.get('username', None)%0A        password = request.GET.get('password', None)%0A%0A        if not username or not password:%0A            return rc.BAD_REQUEST%0A%0A
         try:

Fix the authentication handler to actually work