from rest_framework import status
from rest_framework.authtoken.models import Token
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

from .models import CompanyUser, UserCompanyContext
from .serializers import (
    EmployeeCompanySerializer,
    LoginSerializer,
    SignupSerializer,
    SwitchCompanySerializer,
    UserDetailSerializer,
)


class SignupView(APIView):
    permission_classes = [AllowAny]

    def post(self, request):
        serializer = SignupSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.save()
        token, _ = Token.objects.get_or_create(user=user)
        return Response(
            {
                'token': token.key,
                'user': UserDetailSerializer(user).data,
            },
            status=status.HTTP_201_CREATED,
        )


class LoginView(APIView):
    permission_classes = [AllowAny]

    def post(self, request):
        serializer = LoginSerializer(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, _ = Token.objects.get_or_create(user=user)
        return Response(
            {
                'token': token.key,
                'user': UserDetailSerializer(user).data,
            },
            status=status.HTTP_200_OK,
        )


class LogoutView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        request.user.auth_token.delete()
        return Response({'detail': 'Successfully logged out.'}, status=status.HTTP_200_OK)


class MeView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        payload = UserDetailSerializer(request.user).data
        context = UserCompanyContext.objects.filter(user=request.user).select_related('current_company').first()
        payload['current_company'] = None
        if context and context.current_company:
            payload['current_company'] = {
                'id': context.current_company.id,
                'company_name': context.current_company.company_name,
            }
        return Response(payload)


class SwitchCompanyView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        serializer = SwitchCompanySerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        company_id = serializer.validated_data['company_id']

        membership = CompanyUser.objects.filter(
            user=request.user,
            company_id=company_id,
            status=CompanyUser.Status.ACTIVE,
        ).select_related('company').first()

        if not membership:
            return Response(
                {'detail': 'You are not an active member of this company.'},
                status=status.HTTP_403_FORBIDDEN,
            )

        context, _ = UserCompanyContext.objects.get_or_create(user=request.user)
        context.current_company = membership.company
        context.save(update_fields=['current_company', 'last_updated'])

        return Response(
            {
                'detail': 'Switched into company account successfully.',
                'current_company': {
                    'id': membership.company.id,
                    'company_name': membership.company.company_name,
                },
            },
            status=status.HTTP_200_OK,
        )


class SwitchOutCompanyView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        context, _ = UserCompanyContext.objects.get_or_create(user=request.user)
        context.current_company = None
        context.save(update_fields=['current_company', 'last_updated'])

        return Response(
            {'detail': 'Switched out of company account successfully.', 'current_company': None},
            status=status.HTTP_200_OK,
        )


class EmployeeCompaniesView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        memberships = CompanyUser.objects.filter(
            user=request.user,
            status=CompanyUser.Status.ACTIVE,
            user_type=CompanyUser.UserType.EMPLOYEE,
        ).select_related('company')

        serializer = EmployeeCompanySerializer(memberships, many=True)

        context = UserCompanyContext.objects.filter(user=request.user).first()
        current_company_id = context.current_company_id if context else None

        return Response(
            {
                'count': len(serializer.data),
                'current_company_id': current_company_id,
                'results': serializer.data,
            },
            status=status.HTTP_200_OK,
        )
