import logging

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect

from accounts.models import CompanyUser

logger = logging.getLogger("account_logger")


def count_active_users(company):
    company_users = CompanyUser.objects.filter(company=company, is_deleted=False)
    company_user_count = company_users.count()
    admin_count = 0
    for company_user in company_users:
        if company_user.role == "Admin":
            admin_count += 1
    if admin_count == 0:
        company_users[0].role = "Admin"
        company_users[0].save()

    return int(company_user_count)


@login_required
def add_company_user(request):
    if request.method != 'POST':
        logger.warning(f"Invalid request method: {request.method}")
        messages.error(request, "Invalid request method.", extra_tags="danger")
        return redirect("/manage_company_user")
        # return JsonResponse({'error': 'Invalid request method.'}, status=405)

    try:
        company = request.user.company
        active_users_count = count_active_users(company)
        logger.info(f"Active users count for company {company.name}: {active_users_count}")
    except Exception as e:
        logger.error(f"Error while counting active users: {str(e)}")
        messages.error(request, "Error while getting cmpany users", extra_tags="danger")
        return redirect("/manage_company_user")
        # return JsonResponse({'error': 'Cannot add more users to this company. Limit reached.'}, status=400)

    if int(active_users_count) >= int(company.number_of_logins_allowed):
        logger.warning(f"User limit reached for company {company.name}")
        messages.error(request, "Cannot add more users to this company. Limit reached.", extra_tags="danger")
        return redirect("/manage_company_user")
        # return JsonResponse({'error': 'Cannot add more users to this company. Limit reached.'}, status=400)

    phone = request.POST.get('phone')
    password = request.POST.get('password')
    email = request.POST.get('email')
    name = request.POST.get('name')
    role = request.POST.get('role', 'Staff')
    address = request.POST.get('address', 'Address')
    is_active = request.POST.get('is_active', True)
    if is_active == "on":
        is_active = True
    else:
        is_active = False
    if not password:
        password = "1234"

    if not phone or not password or not email or not name:
        logger.warning(f"Missing required fields. Phone: {phone}, Email: {email}, Name: {name}")
        messages.error(request, "Missing required fields. Phone: {phone}, Email: {email}, Name: {name}", extra_tags="danger")
        return redirect("/manage_company_user")
        # return JsonResponse({'error': 'Missing required fields.'}, status=400)

    if CompanyUser.objects.filter(phone=phone).exists():
        logger.warning(f"Phone number already exists: {phone}")
        messages.error(request, "Phone number already exists.",extra_tags="danger")
        return redirect("/manage_company_user")
        # return JsonResponse({'error': 'Phone number already exists.'}, status=400)
    if CompanyUser.objects.filter(email=email).exists():
        logger.warning(f"Email already exists: {email}")
        messages.error(request, "Email number already exists.", extra_tags="danger")
        return redirect("/manage_company_user")
        # return JsonResponse({'error': 'Email already exists.'}, status=400)

    try:
        user = CompanyUser.objects.create_user(phone=phone, password=password, email=email, name=name, company=company)
        user.role = role
        user.address = address
        user.save()
        user.is_active = bool(is_active)
        user.save()
        logger.info(f"User {user.name} added successfully to company {user.company}", )
        messages.success(request, f"User {user.name} added successfully to company {user.company}", extra_tags="success")
        return redirect("/manage_company_user")
    except Exception as e:
        logger.error(f"Error creating user: {str(e)}")
        messages.error(request, "Error creating user.", extra_tags="danger")
        return redirect("/manage_company_user")
        # return JsonResponse({'error': 'Error creating user.'}, status=500)

