from django.shortcuts import render
import json
from django.conf import settings
from django.shortcuts import render
import hashlib
import os
from django.conf import settings
from datetime import datetime
from django.utils import timezone
from django.db.models import Max, F, Q
import base64
from django.shortcuts import render
from io import BytesIO
from django.conf import settings
from django.template.loader import get_template
from django.http import HttpResponse,HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.templatetags.static import static
from xhtml2pdf import pisa
from num2words import num2words
from django.contrib.staticfiles import finders
from django.contrib import messages

from user_auth.models import *
from company.models import *
from masters.models import *
from financial_year.models import *
from common.utils import *
from common.models import *
from store.models import *
from employee.models import *
from user_auth.forms import *
from privilege.models import *

# ***********************************************************************************************************************************************************
def login(request):
    if request.session.session_key:
        request.session.flush()
    return render(request, 'login.html')

def user_login(request):
    if request.method == "POST":
        uname = request.POST.get('email')
        pwd = request.POST.get('password')
        user_type = request.POST.get('user_type')

        if not uname:
            return JsonResponse({'status': 'error', 'message': 'Email not found'})
        if not pwd:
            return JsonResponse({'status': 'error', 'message': 'Password is required'})

        hashed_pwd = hashlib.md5(pwd.encode()).hexdigest()

        company = company_table.objects.get(status=1, id=1)
        request.session['fyf'] = None

        current_fy = company.current_fy
        tax = select_row(tax_table, {'id':company.tax_id})
        

        financial = financial_year_table.objects.filter(id=current_fy).first()

        if financial:
            request.session['fyf'] = financial.name
            fyf_start, fyf_end = financial.name.split('-')
            request.session['fyf_start'] = fyf_start.strip()
            request.session['fyf_end'] = fyf_end.strip()

        # ---------------- ADMIN LOGIN ----------------
        if user_type == 'admin':
            employee = employee_table.objects.filter(
                email=uname,
                status=1,
                company_id=1,
                branch_id=0,
                is_admin=1
            ).first()

            if not employee:
                return JsonResponse({
                    'status': 'error',
                    'message': 'Admin employee not found for this email'
                })
            
            if employee.password != hashed_pwd:
                return JsonResponse({
                    'status': 'error',
                    'message': 'Password incorrect'
                })

            request.session['user_id'] = employee.id
            request.session['role_id'] = employee.role_id
            request.session['name'] = employee.name
            request.session['user_name'] = employee.nick_name
            request.session['user_mail'] = employee.email
            request.session['company_id'] = employee.company_id
            request.session['user_type'] = 'admin'

            privilege_data = []
            if employee.role_id:
                privileges = privilege_table.objects.filter(role_id=employee.role_id)
                for privilege in privileges:
                    module = module_table.objects.filter(id=privilege.module_id).first()
                    if module:
                        privilege_data.append({
                            'keyword': module.keyword,
                            'is_create': privilege.is_create,
                            'is_read': privilege.is_read,
                            'is_update': privilege.is_update,
                            'is_delete': privilege.is_delete,
                        })
            request.session['user_privileges'] = privilege_data

            sidebar_modules = []
            if employee.role_id:
                admin_privileges = privilege_table.objects.filter(role_id=employee.role_id, is_read=1)
                module_ids = [p.module_id for p in admin_privileges]
                sidebar_modules = list(
                    module_table.objects.filter(id__in=module_ids, is_admin=1).values_list('keyword', flat=True)
                )
            request.session['sidebar_modules'] = sidebar_modules

            return JsonResponse({
                'status': 'success',
                'redirect_url': '/dashboard'
            })

        # ---------------- STORE LOGIN ----------------
        elif user_type == 'stores':
            employee = employee_table.objects.filter(
                email=uname,
                status=1,
                company_id=0,
                is_wholesale=0,
                store_type='store'
            ).exclude(branch_id=0).first()

            if not employee:
                return JsonResponse({
                    'status': 'error',
                    'message': 'Store employee not found for this email'
                })
            
            if employee.password != hashed_pwd:
                return JsonResponse({
                    'status': 'error',
                    'message': 'Password incorrect'
                })

            request.session['user_id'] = employee.id
            request.session['company_id'] = company.id
            request.session['role_id'] = employee.role_id
            request.session['name'] = employee.name
            request.session['user_name'] = employee.nick_name
            request.session['user_mail'] = employee.email
            request.session['branch_id'] = employee.branch_id
            request.session['user_type'] = 'stores'

            branch = select_row(branch_table, {'id': employee.branch_id})

            request.session['branch_name'] = branch.name
            request.session['is_ho'] = branch.is_ho
            request.session['is_store'] = branch.is_store
            request.session['is_franchise'] = branch.is_franchise
            request.session['incharge_id'] = branch.branch_incharge_id
            request.session['tax_id'] = company.tax_id
            request.session['tax_percent'] = tax.percentage

            sidebar_modules = []
            if employee.role_id:
                branch_privileges = privilege_table.objects.filter(role_id=employee.role_id, is_read=1)
                module_ids = [p.module_id for p in branch_privileges]
                sidebar_modules = list(
                    module_table.objects.filter(id__in=module_ids, is_branch=1).values_list('keyword', flat=True)
                )
            request.session['sidebar_modules'] = sidebar_modules

            return JsonResponse({
                'status': 'success',
                'redirect_url': '/dashboard'
            })
        
        # ---------------- WHOLESALE LOGIN ----------------
        elif user_type in ['wholesale', 'whole sales', 'wholesales']:
            employee = employee_table.objects.filter(
                email=uname,
                status=1,
                is_wholesale=1,
                store_type='wholesale'
            ).first()

            if not employee:
                return JsonResponse({
                    'status': 'error',
                    'message': 'Wholesale employee not found for this email'
                })
            
            if employee.password != hashed_pwd:
                return JsonResponse({
                    'status': 'error',
                    'message': 'Password incorrect'
                })

            request.session['user_id'] = employee.id
            request.session['company_id'] = company.id
            request.session['role_id'] = employee.role_id
            request.session['name'] = employee.name
            request.session['user_name'] = employee.nick_name
            request.session['user_mail'] = employee.email
            request.session['branch_id'] = employee.branch_id
            request.session['user_type'] = 'wholesale'
            request.session['tax_id'] = company.tax_id
            request.session['tax_percent'] = tax.percentage

            branch = select_row(branch_table, {'id': employee.branch_id})
            if branch:
                request.session['branch_name'] = branch.name
                request.session['is_ho'] = branch.is_ho
                request.session['is_store'] = branch.is_store
                request.session['is_franchise'] = branch.is_franchise
                request.session['incharge_id'] = branch.branch_incharge_id

            privilege_data = []
            if employee.role_id:
                privileges = privilege_table.objects.filter(role_id=employee.role_id)
                for privilege in privileges:
                    module = module_table.objects.filter(id=privilege.module_id).first()
                    if module:
                        privilege_data.append({
                            'keyword': module.keyword,
                            'is_create': privilege.is_create,
                            'is_read': privilege.is_read,
                            'is_update': privilege.is_update,
                            'is_delete': privilege.is_delete,
                        })
            request.session['user_privileges'] = privilege_data

            sidebar_modules = []
            if employee.role_id:
                wholesale_privileges = privilege_table.objects.filter(role_id=employee.role_id, is_read=1)
                module_ids = [p.module_id for p in wholesale_privileges]
                sidebar_modules = list(
                    module_table.objects.filter(id__in=module_ids, is_branch=1).values_list('keyword', flat=True)
                )
            request.session['sidebar_modules'] = sidebar_modules

            return JsonResponse({
                'status': 'success',
                'redirect_url': '/dashboard'
            })
        
        
        return JsonResponse({
            'status': 'error',
            'message': 'Invalid user type'
        })

    return JsonResponse({
        'status': 'error',
        'message': 'Invalid request'
    })




def logout(request):
    user_type = request.session.get('user_type')
    user_id = request.session.get('user_id')
    
    # For wholesale customers, we need to preserve their UUID for the login redirect
    customer_uuid = None
    if user_type == 'wholesale_customer' and user_id:
        from customer.models import customer_table
        customer = customer_table.objects.filter(id=user_id).first()
        if customer:
            customer_uuid = customer.uuid
            
    request.session.flush()
    
    if user_type == 'wholesale_customer' and customer_uuid:
        return HttpResponseRedirect(f"/wholesale/login/?uuid={customer_uuid}")
        
    return HttpResponseRedirect("/")
