from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status,viewsets,filters
from rest_framework.authentication import TokenAuthentication
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.settings import api_settings
from rest_framework.permissions import IsAuthenticatedOrReadOnly,IsAuthenticated

from . import serializers,models,permissions

# Create your views here.

class HelloApiView(APIView):
	""" Test API View """

	serializer_class = serializers.HelloSerializer

	def get(self,request,format=None):
		""" Return a list of APIview features """
		an_apiview = [
		"Uses HTTP methods as function (get,post,patch,put,delete)",
		"is similiar to trad Django View",
		'GIves you the most control over your app logic',
		'Is mapped manually to URLS',
		]

		return Response({'message':'Hello','an_apiview':an_apiview})

	def post(self,request):
		"""Create a hello message with our name"""
		serializer = self.serializer_class(data=request.data)

		if serializer.is_valid():
			name 	= serializer.validated_data.get('name')
			message = f'Hello {name}'
			return Response({'message':message})

		else:
			return Response(serializer.errors,
				status=status.HTTP_400_BAD_REQUEST
			)

	def put(self,request,pk=None):
		"""Handle updating an object"""
		return Response({'method':'PUT'})

	def patch(self,request,pk=None):
		"""Handle a partial update of an object"""
		return Response({'method':'PATCH'})

	def delete(self,request,pk=None):
		return Response({'method':'DELETE'})

class HelloViewSet(viewsets.ViewSet):
	"""Test API ViewSet"""

	serializer_class = serializers.HelloSerializer

	def list(self,request):
		"""Return a hello message"""
		a_viewset = [
			'Uses actions (list,create,retrieve,update,partial_update)',
			'Automaticallu maps to URLs using Routers',
			'Provides more functionality with less code',
		]

		return Response({'message':'Hello','a_viewset':a_viewset})

	def create(self,request):
		"""Create a new hello message"""
		serializer = self.serializer_class(data=request.data)

		if serializer.is_valid():
			name 	= serializer.validated_data.get('name')
			message	= f'Hello {name}'
			return Response({'message':message})
		else:
			return Response(serializer.errors,
				status=status.HTTP_400_BAD_REQUEST
				)

	def retrieve(self,request,pk=None):
		"""Handle getting an object by its ID"""
		return Response({'http_method':"GET"})

	def update(self,request,pk=None):
		"""Handle updating an object"""
		return Response({'http_method':"PUT"})

	def partial_update(self,request,pk=None):
		"""Handle updating part an object"""
		return Response({'http_method':"PATCH"})

	def destroy(self,request,pk=None):
		"""Handle removing an object"""
		return Response({'http_method':"DELETE"})

class UserProfileViewSet(viewsets.ModelViewSet):
	"""Handle creating and updating profiles """
	serializer_class 		= serializers.UserProfileSerializer
	queryset				= models.UserProfile.objects.all()
	authentication_classes	= (TokenAuthentication,)
	permission_classes		= (permissions.UpdateOwnProfile,)
	filter_backends			= (filters.SearchFilter,)
	search_fields			= ('name','email',)

class UserLoginApiView(ObtainAuthToken):
	"""Handle creating user authentication tokens"""
	renderer_classes	= api_settings.DEFAULT_RENDERER_CLASSES

class UserProfileFeedViewSet(viewsets.ModelViewSet):
	"""Handles creating, reading and updating profile feed item"""
	authentication_classes	= (TokenAuthentication,)
	serializer_class		= serializers.ProfileFeedItemSerializer
	queryset				= models.ProfileFeedItem.objects.all()
	# permission_classes		= (permissions.UpdateOwnStatus,IsAuthenticatedOrReadOnly,)
	permission_classes		= (permissions.UpdateOwnStatus,IsAuthenticated,)

	def perform_create(self,serializer):
		"""Sets the user profile to the logged in user"""
		serializer.save(user_profile=self.request.user)












from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status,viewsets,filters
from rest_framework.authentication import TokenAuthentication
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.settings import api_settings
from rest_framework.permissions import IsAuthenticatedOrReadOnly,IsAuthenticated

from . import serializers,models,permissions

# Create your views here.

class HelloApiView(APIView):
	""" Test API View """

	serializer_class = serializers.HelloSerializer

	def get(self,request,format=None):
		""" Return a list of APIview features """
		an_apiview = [
		"Uses HTTP methods as function (get,post,patch,put,delete)",
		"is similiar to trad Django View",
		'GIves you the most control over your app logic',
		'Is mapped manually to URLS',
		]

		return Response({'message':'Hello','an_apiview':an_apiview})

	def post(self,request):
		"""Create a hello message with our name"""
		serializer = self.serializer_class(data=request.data)

		if serializer.is_valid():
			name 	= serializer.validated_data.get('name')
			message = f'Hello {name}'
			return Response({'message':message})

		else:
			return Response(serializer.errors,
				status=status.HTTP_400_BAD_REQUEST
			)

	def put(self,request,pk=None):
		"""Handle updating an object"""
		return Response({'method':'PUT'})

	def patch(self,request,pk=None):
		"""Handle a partial update of an object"""
		return Response({'method':'PATCH'})

	def delete(self,request,pk=None):
		return Response({'method':'DELETE'})

class HelloViewSet(viewsets.ViewSet):
	"""Test API ViewSet"""

	serializer_class = serializers.HelloSerializer

	def list(self,request):
		"""Return a hello message"""
		a_viewset = [
			'Uses actions (list,create,retrieve,update,partial_update)',
			'Automaticallu maps to URLs using Routers',
			'Provides more functionality with less code',
		]

		return Response({'message':'Hello','a_viewset':a_viewset})

	def create(self,request):
		"""Create a new hello message"""
		serializer = self.serializer_class(data=request.data)

		if serializer.is_valid():
			name 	= serializer.validated_data.get('name')
			message	= f'Hello {name}'
			return Response({'message':message})
		else:
			return Response(serializer.errors,
				status=status.HTTP_400_BAD_REQUEST
				)

	def retrieve(self,request,pk=None):
		"""Handle getting an object by its ID"""
		return Response({'http_method':"GET"})

	def update(self,request,pk=None):
		"""Handle updating an object"""
		return Response({'http_method':"PUT"})

	def partial_update(self,request,pk=None):
		"""Handle updating part an object"""
		return Response({'http_method':"PATCH"})

	def destroy(self,request,pk=None):
		"""Handle removing an object"""
		return Response({'http_method':"DELETE"})

class UserProfileViewSet(viewsets.ModelViewSet):
	"""Handle creating and updating profiles """
	serializer_class 		= serializers.UserProfileSerializer
	queryset				= models.UserProfile.objects.all()
	authentication_classes	= (TokenAuthentication,)
	permission_classes		= (permissions.UpdateOwnProfile,)
	filter_backends			= (filters.SearchFilter,)
	search_fields			= ('name','email',)

class UserLoginApiView(ObtainAuthToken):
	"""Handle creating user authentication tokens"""
	renderer_classes	= api_settings.DEFAULT_RENDERER_CLASSES

class UserProfileFeedViewSet(viewsets.ModelViewSet):
	"""Handles creating, reading and updating profile feed item"""
	authentication_classes	= (TokenAuthentication,)
	serializer_class		= serializers.ProfileFeedItemSerializer
	queryset				= models.ProfileFeedItem.objects.all()
	# permission_classes		= (permissions.UpdateOwnStatus,IsAuthenticatedOrReadOnly,)
	permission_classes		= (permissions.UpdateOwnStatus,IsAuthenticated,)

	def perform_create(self,serializer):
		"""Sets the user profile to the logged in user"""
		serializer.save(user_profile=self.request.user)












# Create your views here. Test API View Return a list of APIview features Create a hello message with our name Handle updating an object Handle a partial update of an object Test API ViewSet Return a hello message Create a new hello message Handle getting an object by its ID Handle updating an object Handle updating part an object Handle removing an object Handle creating and updating profiles Handle creating user authentication tokens Handles creating, reading and updating profile feed item # permission_classes		= (permissions.UpdateOwnStatus,IsAuthenticatedOrReadOnly,) Sets the user profile to the logged in user