from django.conf import settings
from django.db import transaction
from rest_framework.views import APIView
from rest_framework.response import Response
from django.contrib.auth import get_user_model

from apps.core.utils.send_user_email import send_new_user_email
from apps.core.serializers import CreateUserSerializer, UpdateUserSerializer
from apps.permissions.permissions import CompanyPermission
from apps.companies.models import CompanyHistory
import json


User = get_user_model()
email = settings.EMAIL_HOST_USER
react_domain = settings.REACT_DOMAIN


class RegistrationView(APIView):
    permission_classes = [CompanyPermission]
    serializer_class = CreateUserSerializer

    def get_permissions(self):
        return [CompanyPermission("create_users")]

    @transaction.atomic
    def post(self, request, *args, **kwargs):
        payload = json.loads(request.data["data"])
        payload["profile"]["image"] = request.FILES.get("profile_image")
        company_ids = {r["company_id"] for r in payload.get("company_roles", [])}

        if not request.user.is_superuser:
            user_company_ids = set(request.user.companies.values_list("id", flat=True))
            if not company_ids.issubset(user_company_ids):
                return Response(
                    {"detail": "You can only assign users to companies you belong to."},
                    status=403
                )

        serializer = self.serializer_class(data=payload)
        serializer.is_valid(raise_exception=True)
        user = serializer.save()

        subject = "Welcome to the Dealership System"

        send_new_user_email(
            user=user,
            company_ids=list(company_ids),
            generated_password=user._generated_password,
            subject=subject,
        )

        return Response(
            {"message": "User Created Successfully! Ask user to check email for Verification and Password."},
            status=201,
        )


class UserUpdateView(APIView):
    permission_classes = [CompanyPermission]
    serializer_class = UpdateUserSerializer

    def get_permissions(self):
        return [CompanyPermission("manage_users")]

    @transaction.atomic
    def patch(self, request, user_id, *args, **kwargs):
        try:
            user = User.objects.get(id=user_id)
        except User.DoesNotExist:
            return Response({"detail": "User not found."}, status=404)

        payload = json.loads(request.data.get("data", "{}"))
        profile_image = request.FILES.get("profile_image")
        if profile_image:
            payload["profile"]["image"] = profile_image
        company_ids = {r["company_id"] for r in payload.get("company_roles", [])}

        if not request.user.is_superuser:
            user_company_ids = set(request.user.companies.values_list("id", flat=True))
            if not company_ids.issubset(user_company_ids):
                return Response(
                    {"detail": "You can only assign users to companies you belong to."},
                    status=403
                )

        old_phone = getattr(user.profile, "phone_number", None)
        new_phone = payload.get("profile", {}).get("phone_number")
        first = getattr(user.profile, "first_name", "") or ""
        last = getattr(user.profile, "last_name", "") or ""
        full_name = f"{first} {last}".strip()

        serializer = self.serializer_class(user, data=payload, partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        if new_phone is not None and old_phone != new_phone:
            CompanyHistory.objects.create(
                company=request.user.active_company,
                updated_by=request.user,
                action='updated',
                model_name='UserProfile',
                object_id=user.id,
                details=f"{full_name} Phone number changed from {old_phone} to {new_phone}"
            )

        return Response({"message": "User updated successfully."}, status=200)
