from django.shortcuts import render, redirect, get_object_or_404
from .models import Heading, SubHeading, Question,Checklist
from django.http import HttpResponseRedirect
from django.contrib import messages
from django.conf import settings
from product.models import Product
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.db import transaction

def list_heading(request):
    headings = Heading.objects.all()
    total_records = headings.count()
    show_pagination = total_records > settings.PAGE_RECORDS


    if show_pagination:
        page = request.GET.get('page', 1)
        paginator = Paginator(headings, settings.PAGE_RECORDS)  # Show 10 technicians per page
        try:
            headings = paginator.page(page)
        except PageNotAnInteger:
            headings = paginator.page(1)
        except EmptyPage:
            headings = paginator.page(paginator.num_pages)
    return render(request, 'pages/check_list/heading_list.html', {'headings': headings})
        


 
def create_heading(request):
    context={}
    if request.method == 'POST':
        form = request.POST
        heading_name = request.POST.get('heading_name')
            
        if not heading_name:
            messages.error(request, 'Please Enter Heading Name.')
            context['form'] = form
            return render(request,'pages/check_list/create_heading.html',context)
            
        if Heading.objects.filter(heading=heading_name).exists():
            messages.error(request, 'Heading Name Already Exist.')
            context['form'] = form
            return redirect('service:create_heading')    
            

        # if Heading.objects.filter(heading=heading_name).exists():
        #     messages.error(request, 'Heading Name Already Exist.')
        #     context['form'] = form
        #     return render(request,'pages/check_list/create_heading.html',context)
        
        heading = Heading(heading=heading_name,created_by=request.user)
        heading.save()
        messages.success(request, 'Heading Added Successfully.')
        return redirect('service:list_heading')
    context['form'] = {}
    return render(request,'pages/check_list/create_heading.html',context)

 
def edit_heading(request,id):
    
    heading = get_object_or_404(Heading, id=id)
    if request.method == 'POST':
          
        heading_name = request.POST.get('heading_name')
        heading = get_object_or_404(Heading, id=id)
            
        if not heading_name:
            messages.error(request, 'Please Enter Heading Name.')
            return render(request,'pages/check_list/edit_heading.html',context)
            
        if Heading.objects.filter(heading=heading_name).exclude(id=id).exists():
            messages.error(request, 'Heading Name Already Exist.')
            return redirect('service:edit_heading',id)    
        
        
        heading.heading = heading_name
        heading.save()
        messages.success(request, 'Heading Updated Successfully.')
        return redirect('service:list_heading')
    return render(request, 'pages/check_list/edit_heading.html', { 'heading':heading })
 
 
 
def delete_heading(request, id):
    heading = Heading.objects.get(id=id)
    if SubHeading.objects.filter(heading=heading).exists():
        messages.error(request, 'Don`t delete heading as it is assigned to one or more subheadings.')
        return redirect('service:list_heading')
    heading.deleted_by=request.user
    heading.delete()
    messages.success(request, 'Heading Deleted Successfully.')
    return redirect('service:list_heading')




def list_sub_heading(request):
    sub_headings = SubHeading.objects.all()
    total_records = sub_headings.count()
    show_pagination = total_records > settings.PAGE_RECORDS
    if show_pagination:
        page = request.GET.get('page', 1)
        paginator = Paginator(sub_headings, settings.PAGE_RECORDS)  # Show 10 technicians per page
        try:
            sub_headings = paginator.page(page)
        except PageNotAnInteger:
            sub_headings = paginator.page(1)
        except EmptyPage:
            sub_headings = paginator.page(paginator.num_pages)
    return render(request, 'pages/check_list/sub_heading_list.html', {'sub_headings': sub_headings})
        

       

def create_sub_heading(request):
    context={}
    if request.method == 'POST':
        form = request.POST
        heading_id = request.POST.get('heading')
        heading = get_object_or_404(Heading, id=heading_id)
        sub_heading_name = request.POST.get('sub_heading_name')
            
        if not sub_heading_name:
            messages.error(request, 'Please Enter Sub Heading Name.')
            context['form'] = form
            return render(request,'pages/check_list/create_sub_heading.html',context)

        if SubHeading.objects.filter(subheading=sub_heading_name).exists():
            messages.error(request, 'Sub Heading Name Already Exist.')
            context['form'] = form
            return render(request,'pages/check_list/create_sub_heading.html',context)
        
        sub_heading = SubHeading(subheading=sub_heading_name,heading=heading,created_by=request.user)
        sub_heading.save()
        messages.success(request, 'Sub Heading Added Successfully.')
        return redirect('service:list_sub_heading')
    context['form'] = {}
    context={'headings': Heading.objects.all()}
    return render(request,'pages/check_list/create_sub_heading.html',context,)

 
def edit_sub_heading(request,id):
    
    sub_heading = get_object_or_404(SubHeading, id=id)
    if request.method == 'POST':
        heading_id = request.POST.get('heading')
        heading = get_object_or_404(Heading, id=heading_id) 
        sub_heading_name = request.POST.get('sub_heading_name')
        
        if SubHeading.objects.filter(subheading=sub_heading_name).exclude(id=id).exists():
            messages.error(request, ' Sub Heading Name Already Exist.')
            return redirect('service:list_sub_heading',id)    
        
        sub_heading.subheading = sub_heading_name
        sub_heading.heading=heading
        sub_heading.save()
        messages.success(request, 'Sub Heading Updated Successfully.')
        return redirect('service:list_sub_heading')
    return render(request, 'pages/check_list/edit_sub_heading.html', { 'sub_heading':sub_heading,'headings': Heading.objects.all() })
 
 
 
def delete_sub_heading(request, id):
    sub_heading = get_object_or_404(SubHeading, id=id)
    if Question.objects.filter(subheading=sub_heading).exists():
        messages.error(request, 'Don`t delete subheading as it is associated with one or more questions.')
        return redirect('service:list_sub_heading')

    sub_heading.deleted_by = request.user 
    sub_heading.delete()
    messages.success(request, 'Sub Heading Deleted Successfully.')
    return redirect('service:list_sub_heading')


def list_checklist(request):
    checklists = Checklist.objects.all()
    total_records = checklists.count()
    show_pagination = total_records > settings.PAGE_RECORDS
    # dd(checklists[0])
    # print(checklists[0])
    if show_pagination:
        page = request.GET.get('page', 1)
        paginator = Paginator(checklists, settings.PAGE_RECORDS)  # Show 10 technicians per page
        try:
            checklists = paginator.page(page)
        except PageNotAnInteger:
            checklists = paginator.page(1)
        except EmptyPage:
            checklists = paginator.page(paginator.num_pages)
    return render(request, 'pages/check_list/question_list.html', {'checklists': checklists})
    
    
def view_checklist(request,id):
    checklist = Checklist.objects.get(id=id)
    questions = Question.objects.filter(checklist=checklist)
      
    total_records = questions.count()
    show_pagination = total_records > settings.PAGE_RECORDS


    if show_pagination:
        page = request.GET.get('page', 1)
        paginator = Paginator(questions, settings.PAGE_RECORDS)  # Show 10 technicians per page
        try:
            questions = paginator.page(page)
        except PageNotAnInteger:
            questions = paginator.page(1)
        except EmptyPage:
            questions = paginator.page(paginator.num_pages)
        
    return render(request, 'pages/check_list/checklist_view.html', {'questions': questions,'checklist':id})    
    
    
    
    
    
    
    
    
    

def create_checklist(request):
    context = {}
    headings = Heading.objects.all()
    subheadings = SubHeading.objects.all()
    products = Product.objects.filter(is_active=True)

    if request.method == 'POST':
        # dd(request.POST)

        checklist_names = request.POST.getlist('title[]')
        ckcount_list = request.POST.getlist('ckcount[]')
        types = request.POST.getlist('service_type[]')
        parts = request.POST.getlist('part_needed[]')
        product_ids_list = request.POST.getlist('product[0][]')
        heading_ids = request.POST.getlist('heading[0][]')
        subheading_ids = request.POST.getlist('subheading[0][]')
        questions = request.POST.getlist('question[0][]')

        for index in range(len(ckcount_list)):
            ckcount=ckcount_list[index]
            checklist_name = checklist_names[index]
            type_val = types[index]
            is_part_val = parts[index] if index < len(parts) else None
           

            if is_part_val :
                is_part_val = True
            else:
                is_part_val = False

          
             
         


            # existing_checklist = Checklist.objects.filter(checklist_name=checklist_name).first()
           
            # if existing_checklist:
            #     messages.error(request, f'Checklist Name  {checklist_name.upper()} Already Exists.')
            #     return render(request, 'pages/check_list/create_question.html', context)
           

            checklist = Checklist.objects.create(
                checklist_name=checklist_name,
                type=type_val,
                is_part=is_part_val
            )
            
            questions = request.POST.getlist('question['+ckcount+'][]')
            product_ids_list = request.POST.getlist('product['+ckcount+'][]')
            heading_ids = request.POST.getlist('heading['+ckcount+'][]')
            subheading_ids = request.POST.getlist('subheading['+ckcount+'][]')
            # Ensure all lists have the same length
            min_length = len(questions)
            print("hhhhhhhhhhhhhhhhhhh")

            test='product['+ckcount+'][]'

            print( request.POST.getlist(test))
            # dd(request.POST)
            for idx in range(len(questions)) :
                question_val = questions[idx]
                heading_id = heading_ids[idx]
                subheading_id = subheading_ids[idx]

                product_ids = product_ids_list
                # print( product_ids)

                heading = get_object_or_404(Heading, id=heading_id) if heading_id else None
                subheading = get_object_or_404(SubHeading, id=subheading_id) if subheading_id else None

                if Question.objects.filter(checklist=checklist, question=question_val).exists():
                    messages.error(request, f'Question "{question_val}" Already Exists for Checklist "{checklist_name}".')
                    context['headings'] = headings
                    context['subheadings'] = subheadings
                    return render(request, 'pages/check_list/create_question.html', context)

                question_obj = Question.objects.create(
                    checklist=checklist,
                    question=question_val,
                    heading=heading,
                    subheading=subheading,
                    created_by=request.user
                )
                # question_obj.product.clear()
                question_obj.product.add(*product_ids)
                question_obj.save()

        messages.success(request, 'Checklist Added Successfully.')
        return redirect('service:list_question')

    context['headings'] = headings
    context['subheadings'] = subheadings
    context['products'] = products
    return render(request, 'pages/check_list/create_question.html', context)


def edit_checklist(request, id):

    context = {}
    checklist = Checklist.objects.get(id=id)
    questions = Question.objects.filter(checklist=checklist)

    if request.method == 'POST':
        # dd(request.POST)
        checklist_names = request.POST.get('title')
        ckcount_list = request.POST.getlist('p_count[]')
        types = request.POST.get('service_type')
        parts = request.POST.getlist('part_needed')
        deleted = request.POST.getlist('deleted[]')
        
        if parts:
            parts = True
        else:
            parts = False

        checklist.checklist_name = checklist_names
        checklist.type = types
        checklist.part = parts
        checklist.save()
        for x in range(len(deleted)):

            delete_question = Question.objects.get(id=int(deleted[x]))
            delete_question.delete()
        for index in range(len(ckcount_list)):
            ckcount=ckcount_list[index]
            question_val = request.POST.getlist('question['+ckcount+']')

            product_ids_list = request.POST.getlist('product[1]')
            print(ckcount_list)
            print(question_val)

            heading_id = request.POST.getlist('heading['+ckcount+']')
            subheading_id = request.POST.getlist('subheading['+ckcount+']')
            # product_ids = product_ids_list.split(',') if product_ids_list else []
            product_ids = product_ids_list

            print(heading_id)
            
            if len(heading_id):
                heading = get_object_or_404(Heading, id=heading_id[0]) if heading_id[0] else None
                subheading = get_object_or_404(SubHeading, id=subheading_id[0]) if subheading_id[0] else None
                if request.POST.getlist('existing['+ckcount+']'):
                    existing = request.POST.getlist('existing['+ckcount+']')
                    print(existing)
                    existing_question = Question.objects.filter(id=int(existing[0])).first()
                    # dd(existing_question)
                    # Update existing question
                    existing_question.question=question_val[0]
                    existing_question.heading = heading
                    existing_question.subheading = subheading
                    existing_question.product.clear()
                    existing_question.product.add(*product_ids)
                    # dd(existing_question)
                    existing_question.save()
                else:
                    # dd('new')
                    new_question = Question.objects.create(
                        checklist=checklist,
                        question=question_val[0],
                        heading=heading,
                        subheading=subheading,
                        created_by=request.user
                    )
                    new_question.product.add(*product_ids)
                    new_question.save()

        # for idx in range(len(questions)):
        #     dd(idx)
        #     question_val = questions[idx]
        #     heading_id = heading_ids[idx]
        #     subheading_id = subheading_ids[idx]
        #     product_ids = product_ids_list[idx].split(',') if product_ids_list[idx] else []

        #     heading = get_object_or_404(Heading, id=heading_id) if heading_id else None
        #     subheading = get_object_or_404(SubHeading, id=subheading_id) if subheading_id else None

        #     existing_question = Question.objects.filter(checklist=checklist,question=question_val).first()

        #     if existing_question:
        #         # Update existing question
        #         existing_question.heading = heading
        #         existing_question.subheading = subheading
        #         existing_question.product.clear()
        #         existing_question.product.add(*product_ids)
        #         existing_question.save()
        #     else:
               
        #         new_question = Question.objects.create(
        #             checklist=checklist,
        #             question=question_val,
        #             heading=heading,
        #             subheading=subheading,
        #             created_by=request.user
        #         )
               
        #         new_question.product.add(*product_ids)
        #         new_question.save()
        messages.success(request, 'Checklist Updated Successfully.')
        return redirect('service:list_question')

    return render(request, 'pages/check_list/edit_question.html', {
        'checklist': checklist,
        'questions': questions,
        'headings': Heading.objects.all(),
        'products': Product.objects.filter(is_active=True),
        'subheadings': SubHeading.objects.all()
    })
 
def delete_checklist(request, id):
    checklist = get_object_or_404(Question, id=id)
    checklist.deleted_by = request.user 
    checklist.delete()
    messages.success(request, 'Question Deleted Successfully.')
    return redirect('service:list_question')
    
    
def delete_question(request, id):
    question = get_object_or_404(Checklist, id=id)
    
   
    # checklist=question.checklist
   
    question.deleted_by = request.user 
    question.delete()
    messages.success(request, 'Checklist Deleted Successfully.')
    return redirect('service:list_question' )
