from datetime import date
from django.conf import settings
from rest_framework import status
from django.db import transaction
from rest_framework import permissions
from apps.core.models import UserActivation
from rest_framework.views import APIView
from rest_framework.response import Response
from django.contrib.auth import get_user_model
from utils.threads.email_thread import send_mail
from apps.core.serializers import CreateUserSerializer
from apps.userprofile.serializers import UserProfileSerializer
from apps.core.utils.reset_email_token_util import reset_email_token
from apps.permissions.permissions import CompanyPermission
from apps.companies.models import Company
from apps.permissions.models import Role
User = get_user_model()
email = settings.EMAIL_HOST_USER
react_domain = settings.REACT_DOMAIN


class RegistrationBKPView(APIView):
    """Register and login api instant """

    permission_classes = [CompanyPermission]
    serializer_class = CreateUserSerializer

    def get_permissions(self):
        """Return permission instance for create_users permission"""
        return [CompanyPermission('create_users')]  # Instance with specific permission

    @transaction.atomic
    def post(self, request, *args, **kwargs):

        user_companies = request.user.companies.all()
        requested_companies = request.data.getlist('company_ids', [])

        if requested_companies and not request.user.is_superuser:
            user_company_ids = [str(c.id) for c in user_companies]
            if not all(cid in user_company_ids for cid in requested_companies):
                return Response({
                    "detail": "You can only assign users to companies you belong to"
                }, status=status.HTTP_403_FORBIDDEN)

        for company_id in requested_companies:
            company = Company.objects.filter(id=company_id).first()
            has_role = Role.objects.filter(company=company).exists()
            print(f"company: {company.name}")
            print(f"has role: {has_role}")
            if not has_role:
                return Response({
                    "detail": f"No roles exists in {company.name}. Please select another company or add some roles from role page."
                }, status=status.HTTP_400_BAD_REQUEST)

        serializer = CreateUserSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        instance = serializer.instance

        secret_key = reset_email_token(50)
        UserActivation(user=instance, token=secret_key).save()

        generated_password = getattr(instance, '_generated_password', 'Password not generated')
        if requested_companies:
            companies = Company.objects.filter(id__in=requested_companies)
            company_names = ", ".join([company.name for company in companies])

            key = {
                'email': request.data['email'],
                'password': generated_password,  # Include generated password
                'firstname': instance.profile.first_name,
                'lastname': instance.profile.last_name,
                'companyName': company_names,
                'button': react_domain,
                'year': date.today().year
            }
            subject = "Account Registration for " + company_names
            template_name = "auth/new_userRegister.html"
            recipient = [request.data['email']]

            send_mail(subject=subject, html_content=template_name,
                      recipient_list=recipient, key=key)

            # for company in companies:
            #     company_key = {
            #         'username': instance.username,
            #         'name': company.name,
            #         'year': date.today().year,
            #     }
            #     send_mail(
            #         subject=f"You are added to {company.name}",
            #         html_content="auth/user_added_to_company.html",  # create this template
            #         recipient_list=[request.data['email']],
            #         key=company_key
            #     )

        return Response({
            "message": "User Created Successfully! Check your email for Verification and Password."
        }, status=status.HTTP_201_CREATED)