import random
from django.shortcuts import render, redirect
from django.views import View
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from hr_department.models import Attendance, Team, Vendors, Team_Projects
from users.models import User_Departments, User_Types
from program_department.models import Projects
import pandas as pd
# Create your views here.

class TeamRegistrationView(LoginRequiredMixin, View):

    def get(self, request):
        departments = User_Departments.objects.all()
        designations = User_Types.objects.all()
        projects = Projects.objects.all()
        return render(request, "team-registration.html", {'departments' : departments, 'designations' : designations, 'projects' : projects})
    

    def post(self, request):
        team = Team()
        team.employment_type = request.POST.get("employment_type")
        team.employee_id = ''.join((random.choice('1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ') for i in range(6)))
        team.position = request.POST.get("position")
        team.name = request.POST.get("name")
        team.father_name = request.POST.get("father_name")
        team.mother_name = request.POST.get("mother_name")
        team.email = request.POST.get("email")
        team.mobile = request.POST.get("mobile")
        team.date_of_birth = request.POST.get("date_of_birth")
        team.gender = request.POST.get("gender")
        team.qualification = request.POST.get("qualification")
        team.university = request.POST.get("university")
        team.experience = request.POST.get("experience")                                      
        team.marital_status = request.POST.get("marital_status")
        team.emergency_contact_no = request.POST.get("emergency_contact_no")
        team.joining_date = request.POST.get("joining_date")
        team.designation_id = request.POST.get("designation")
        team.department_id = request.POST.get("department")
        team.payment_type = request.POST.get("payment_type")
        team.basic_amount = request.POST.get("basic_amount")
        team.ctc_amount = request.POST.get("ctc_amount")
        team.epf = request.POST.get("epf")
        team.esic = request.POST.get("esic")
        team.pan_no = request.POST.get("pan_no")
        team.photo = request.FILES.get("photo")
        team.resume = request.FILES.get("resume")
        team.aadhar = request.FILES.get("aadhar")
        team.pan_card = request.FILES.get("pan_card")
        team.marksheet = request.FILES.get("marksheet")
        team.address = request.POST.get("address")
        team.message = request.FILES.get("message")
        team.assets = request.POST.get("assets")
        team.condition = request.POST.get("condition")
        team.issue_date = request.POST.get("issue_date")
        team.return_date = request.POST.get("return_date")
        if "declaration" in request.FILES:
            team.declaration = request.FILES.get("declaration")
        team.save()
        if team.id:
            if len(request.POST.getlist('projects')):
                Team_Projects.objects.bulk_create([
                    Team_Projects(member_id=team.id, project_id = project) for project in request.POST.getlist('projects')
                ])
        messages.success(request, "Team member registered successfully.")
        return redirect("TeamView")
    



class TeamView(LoginRequiredMixin, View):

    def get(self, request):
        members = Team.objects.all()
        return render(request, "team.html", {'members' : members})


    def post(self, request):
        try:
            id = request.POST.get("id")
            team = Team.objects.get(id=id)
            team.delete()
            messages.success(request, "Team member deleted successfully.")
            return redirect("TeamView")
        except Team.DoesNotExist:
            messages.error(request, "Team member not found.")
            return redirect("TeamView")
    

class MemberView(LoginRequiredMixin, View):
    def get(self, request, id):
        team = Team.objects.get(id = id)
        project_list = list(Team_Projects.objects.filter(member_id = id).values_list('project_id', flat=True))
        departments = User_Departments.objects.all()
        designations = User_Types.objects.all()
        projects = Projects.objects.all()
        return render(request, "edit-team.html", {'team' : team, 'departments' : departments, 'designations' : designations, 'projects' : projects, 'project_list' : project_list})
    

    def post(self, request, id):
        team = Team.objects.get(id = id)
        team.employment_type = request.POST.get("employment_type")
        team.employee_id = ''.join((random.choice('1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ') for i in range(6)))
        team.position = request.POST.get("position")
        team.name = request.POST.get("name")
        team.father_name = request.POST.get("father_name")
        team.mother_name = request.POST.get("mother_name")
        team.email = request.POST.get("email")
        team.mobile = request.POST.get("mobile")
        team.date_of_birth = request.POST.get("date_of_birth")
        team.gender = request.POST.get("gender")
        team.qualification = request.POST.get("qualification")
        team.university = request.POST.get("university")
        team.experience = request.POST.get("experience")                                      
        team.marital_status = request.POST.get("marital_status")
        team.emergency_contact_no = request.POST.get("emergency_contact_no")
        team.joining_date = request.POST.get("joining_date")
        team.designation_id = request.POST.get("designation")
        team.department_id = request.POST.get("department")
        team.payment_type = request.POST.get("payment_type")
        team.basic_amount = request.POST.get("basic_amount")
        team.ctc_amount = request.POST.get("ctc_amount")
        team.epf = request.POST.get("epf")
        team.esic = request.POST.get("esic")
        team.pan_no = request.POST.get("pan_no")
        team.address = request.POST.get("address")
        team.message = request.FILES.get("message")
        team.assets = request.POST.get("assets")
        team.condition = request.POST.get("condition")
        team.issue_date = request.POST.get("issue_date")
        team.return_date = request.POST.get("return_date")
        if 'photo' in request.FILES:
            team.photo = request.FILES.get("photo")
        if 'resume' in request.FILES:
            team.resume = request.FILES.get("resume")
        if 'aadhar' in request.FILES:
            team.aadhar = request.FILES.get("aadhar")
        if 'pan_card' in request.FILES:
            team.pan_card = request.FILES.get("pan_card")
        if 'marksheet' in request.FILES:
            team.marksheet = request.FILES.get("marksheet")
        if "declaration" in request.FILES:
            team.declaration = request.FILES.get("declaration")
        team.save()
        Team_Projects.objects.filter(member_id = team.id).delete()
        if len(request.POST.getlist('projects')):   
            Team_Projects.objects.bulk_create([
                Team_Projects(member_id=team.id, project_id = project) for project in request.POST.getlist('projects')
            ])
        messages.success(request, "Team member registered successfully.")
        return redirect("TeamView")
    

class AttendanceView(LoginRequiredMixin, View):

    def get(self, request):
        members = Team.objects.all()
        years = Attendance.objects.values_list('year', flat=True).distinct().order_by('year')
        # attendances = Attendance.objects.filter(month=request.POST.get("month"), year=request.POST.get("year"))
        if 'year' in request.GET and request.GET['year'] != "" and 'month' in request.GET and request.GET['month'] != "":
            attendances = Attendance.objects.filter(month=int(request.GET['month']), year=int(request.GET['year']))
            year = request.GET['year']
            month = request.GET['month'] 
        else:
            last_attendance = Attendance.objects.order_by('-id').first()
            if last_attendance:
                year = last_attendance.year
                month = last_attendance.month
            else:
                year = None
                month = None
            attendances = Attendance.objects.filter(month=month, year=year)
        results = []
        for att in attendances:
            df = pd.read_excel(att.file.path)  
            counts = df["Status"].value_counts().to_dict()
            present = counts.get("Present", 0)
            absent = counts.get("Absent", 0)
            leave = counts.get("Leave", 0)
            holiday = counts.get("Holiday", 0)
            total_hours = df["Working Hours"].sum()
            results.append({
                "id" : att.id,
                "employee_id": att.member.employee_id,
                "email": att.member.email,
                "mobile": att.member.mobile,
                "name": att.member.name,
                "present": present,
                "absent": absent,
                "leave": leave,
                "holiday" : holiday,
                "file" : att.file.url,
                "total_hours": round(total_hours, 2),
            })
        return render(request, "attendance.html", {'attendance' : results, 'members' : members, 'years' : years, 'year' : year, 'month' : month})


    def post(self, request):
        try:
            attendance = Attendance.objects.get(member_id = request.POST.get("member_id"), month = request.POST.get("month"), year = request.POST.get("year"))
        except Attendance.DoesNotExist: 
            attendance = Attendance()
        attendance.member_id = request.POST.get("member_id")
        attendance.month = request.POST.get("month")
        attendance.year = request.POST.get("year")
        attendance.file = request.FILES.get("file")
        attendance.save()
        messages.success(request, "Attendance saved successfully.")
        return redirect("AttendanceView")
        
class AttendanceDeleteView(LoginRequiredMixin, View):

    def post(self, request):
        try:
            id = request.POST.get("id")
            attendance = Attendance.objects.get(id = id)
            attendance.delete()
            messages.success(request, "Attendance deleted successfully.")
            return redirect("AttendanceView")
        except Attendance.DoesNotExist:
            messages.error(request, "Vendor not found.")
            return redirect("AttendanceView")
        

class MemberDetailView(LoginRequiredMixin, View):
    def get(self, request, id):
        try:
            member = Team.objects.get(id = id)
            project_list = list(Team_Projects.objects.filter(member_id = id).values_list('project__project', flat=True))
            project_list = ', '.join(str(project) for project in project_list)
            return render(request, "member.html", {'member' : member, 'project_list' : project_list})
        except Team.DoesNotExist:
            return redirect("TeamView")
        


class VendorRegistrationView(LoginRequiredMixin, View):

    def get(self, request):
        return render(request, "vendor-registration.html")
    

    def post(self, request):
        vendor = Vendors()
        vendor.name = request.POST.get("name")
        vendor.email = request.POST.get("email")
        vendor.mobile = request.POST.get("mobile")
        vendor.pan_no = request.POST.get("pan_no")
        if 'pan_card' in request.FILES:
            vendor.pan_card = request.FILES.get("pan_card")
        vendor.address = request.POST.get("address")
        vendor.message = request.FILES.get("message")
        vendor.save()
        messages.success(request, "Vendor registered successfully.")
        return redirect("VendorView")
    


class VendorView(LoginRequiredMixin, View):

    def get(self, request):
        vendors = Vendors.objects.all()
        return render(request, "vendors.html", {'vendors' : vendors})


    def post(self, request):
        try:
            id = request.POST.get("id")
            vendor = Vendors.objects.get(id=id)
            vendor.delete()
            messages.success(request, "Vendor deleted successfully.")
            return redirect("VendorView")
        except Team.DoesNotExist:
            messages.error(request, "Vendor not found.")
            return redirect("VendorView")
        

class VendorMemberView(LoginRequiredMixin, View):
    
    def get(self, request, id):
        vendor = Vendors.objects.get(id = id)
        return render(request, "edit-vendor.html", {'vendor' : vendor})
    
    def post(self, request, id):
        vendor = Vendors.objects.get(id = id)
        vendor.name = request.POST.get("name")
        vendor.email = request.POST.get("email")
        vendor.mobile = request.POST.get("mobile")
        vendor.pan_no = request.POST.get("pan_no")
        if "pan_card" in request.FILES:
            vendor.pan_card = request.FILES.get("pan_card")
        vendor.address = request.POST.get("address")
        vendor.message = request.FILES.get("message")
        vendor.save()
        messages.success(request, "Vendor updated successfully.")
        return redirect("VendorView")
    


class VendorMemberDetailView(LoginRequiredMixin, View):
    def get(self, request, id):
        try:
            vendor = Vendors.objects.get(id = id)
            return render(request, "vendor.html", {'vendor' : vendor})
        except Vendors.DoesNotExist:
            return redirect("VendorView")