from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from django.contrib.auth.mixins import LoginRequiredMixin

from django.db.models import F, FloatField, Count, Sum
from hr_department.models import Team
from program_department.models import Programs, Projects
from finance_department.models import Expenditure, Incomes, HRExpenditure, EquipmentExpenditure, TravelExpenditure, IECExpenditure, AccommodationExpenditure, MiscellaneousExpenditure, OfficeExpenditure
# Create your views here.


class DashboardViews(LoginRequiredMixin, View):

    def get(self, request):
        
        
        team = Team.objects.all()
        beneficiaries = Programs.objects.all()
        projects = Projects.objects.all()

        income_amount = Incomes.objects.all()
        hr_amount = HRExpenditure.objects.all()
        equipment_amount = EquipmentExpenditure.objects.all()
        travel_amount = TravelExpenditure.objects.all()
        iec_amount = IECExpenditure.objects.all()
        accomodation_amount = AccommodationExpenditure.objects.all()
        miscellaneous_amount = MiscellaneousExpenditure.objects.all()
        office_amount = OfficeExpenditure.objects.all()

        if 'project' in request.GET and request.GET['project'] != "All":
            income_amount = Incomes.objects.filter(project_id = request.GET['project'])
            hr_amount = HRExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            equipment_amount = EquipmentExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            travel_amount = TravelExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            iec_amount = IECExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            accomodation_amount = AccommodationExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            miscellaneous_amount = MiscellaneousExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            office_amount = OfficeExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            project = request.GET and request.GET['project']
            team = team.filter(program_team__project_id = request.GET['project']).distinct()
            beneficiaries = beneficiaries.filter(project_id = request.GET['project'])
        else:
            project = 'All'


        if 'date' in request.GET and request.GET['date'] != "":
            income_amount = income_amount.filter(payment_date = request.GET['date'])
            hr_amount = hr_amount.filter(hr_expence_date = request.GET['date'])
            equipment_amount = equipment_amount.filter(equipment_expence_date = request.GET['date'])
            travel_amount = travel_amount.filter(travel_expence_date = request.GET['date'])
            iec_amount = iec_amount.filter(iec_expence_date = request.GET['date'])
            accomodation_amount = accomodation_amount.filter(accomodation_expence_date = request.GET['date'])
            miscellaneous_amount = miscellaneous_amount.filter(miscellaneous_expence_date = request.GET['date'])
            office_amount = office_amount.filter(office_expence_date = request.GET['date'])
            date = request.GET['date']
        else:
            date=""

        income_amount = income_amount.aggregate(income_amount = Sum('received_amount'))['income_amount'] or 0
        hr_amount = hr_amount.aggregate(hr_amount = Sum('hr_amount'))['hr_amount'] or 0
        equipment_amount = equipment_amount.aggregate(equipment_amount = Sum('equipment_amount'))['equipment_amount'] or 0
        travel_amount = travel_amount.aggregate(travel_amount = Sum('travel_amount'))['travel_amount'] or 0
        iec_amount = iec_amount.aggregate(iec_amount = Sum('iec_amount'))['iec_amount'] or 0
        accommodation_amount = accomodation_amount.aggregate(accommodation_amount = Sum('accommodation_amount'))['accommodation_amount'] or 0
        miscellaneous_amount = miscellaneous_amount.aggregate(miscellaneous_amount = Sum('miscellaneous_amount'))['miscellaneous_amount'] or 0
        office_amount = office_amount.aggregate(office_amount = Sum('office_amount'))['office_amount'] or 0
        expenditure_amount = hr_amount + equipment_amount + travel_amount + iec_amount + accommodation_amount + miscellaneous_amount + office_amount
        team = team.count()
        beneficiaries = beneficiaries.count()
        return render(request, "dashboard.html", {'income_amount' : income_amount, 'expenditure_amount' : expenditure_amount, 'team' : team, 'beneficiaries' : beneficiaries, 'projects' : projects, 'project' : project, 'date' : date})





class ExpenditureChartView(LoginRequiredMixin, View):

    def get(self, request):
        # Get counts grouped by state as array

        hr_amount = HRExpenditure.objects.all()
        equipment_amount = EquipmentExpenditure.objects.all()
        travel_amount = TravelExpenditure.objects.all()
        iec_amount = IECExpenditure.objects.all()
        accommodation_amount = AccommodationExpenditure.objects.all()
        miscellaneous_amount = MiscellaneousExpenditure.objects.all()
        office_amount = OfficeExpenditure.objects.all()

        if 'project' in request.GET and request.GET['project'] != "All":
            hr_amount = HRExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            equipment_amount = EquipmentExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            travel_amount = TravelExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            iec_amount = IECExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            accommodation_amount = AccommodationExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            miscellaneous_amount = MiscellaneousExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            office_amount = OfficeExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
        
        if 'date' in request.GET and request.GET['date'] != "":
            hr_amount = hr_amount.filter(hr_expence_date = request.GET['date'])
            equipment_amount = equipment_amount.filter(equipment_expence_date = request.GET['date'])
            travel_amount = travel_amount.filter(travel_expence_date = request.GET['date'])
            iec_amount = iec_amount.filter(iec_expence_date = request.GET['date'])
            accomodation_amount = accomodation_amount.filter(accomodation_expence_date = request.GET['date'])
            miscellaneous_amount = miscellaneous_amount.filter(miscellaneous_expence_date = request.GET['date'])
            office_amount = office_amount.filter(office_expence_date = request.GET['date'])
        
        hr_amount = hr_amount.aggregate(hr_amount = Sum('hr_amount'))['hr_amount'] or 0
        equipment_amount = equipment_amount.aggregate(equipment_amount = Sum('equipment_amount'))['equipment_amount'] or 0
        travel_amount = travel_amount.aggregate(travel_amount = Sum('travel_amount'))['travel_amount'] or 0
        iec_amount = iec_amount.aggregate(iec_amount = Sum('iec_amount'))['iec_amount'] or 0
        accommodation_amount = accommodation_amount.aggregate(accommodation_amount = Sum('accommodation_amount'))['accommodation_amount'] or 0
        miscellaneous_amount = miscellaneous_amount.aggregate(miscellaneous_amount = Sum('miscellaneous_amount'))['miscellaneous_amount'] or 0
        office_amount = office_amount.aggregate(office_amount = Sum('office_amount'))['office_amount'] or 0
        
        amounts = [
            {'name' : 'HR Amount', 'y': hr_amount},
            {'name' : 'Equipment Amount', 'y' : equipment_amount},
            {'name' : 'Travel Amount', 'y' : travel_amount},
            {'name' : 'IEC Amount', 'y' : iec_amount},
            {'name' : 'Accomodation Amount', 'y' : accommodation_amount},
            {'name' : 'Miscellaneous Amount', 'y' : miscellaneous_amount},
            {'name' : 'Office Amount', 'y' : office_amount},
        ]

        return JsonResponse({'amounts': amounts}, safe=False)
        



class IncomeChartView(LoginRequiredMixin, View):

    def get(self, request):
        
        incomes_data = Incomes.objects.all()
        
        if 'project' in request.GET and request.GET['project'] != "All":
            incomes_data = incomes_data.filter(project_id = request.GET['project'])

        if 'date' in request.GET and request.GET['date'] != "":
            incomes_data = incomes_data.filter(payment_date = request.GET['date'])


        human_resource = incomes_data.aggregate(human_resource = Sum('human_resource'))['human_resource'] or 0
        camp_expenses = incomes_data.aggregate(camp_expenses = Sum('camp_expenses'))['camp_expenses'] or 0
        training_expenses = incomes_data.aggregate(training_expenses = Sum('training_expenses'))['training_expenses'] or 0
        equipment_expenses = incomes_data.aggregate(equipment_expenses = Sum('equipment_expenses'))['equipment_expenses'] or 0
        travel_expenses = incomes_data.aggregate(travel_expenses = Sum('travel_expenses'))['travel_expenses'] or 0
        material_expences = incomes_data.aggregate(material_expences = Sum('material_expences'))['material_expences'] or 0
        administrative_expenses = incomes_data.aggregate(administrative_expenses = Sum('administrative_expenses'))['administrative_expenses'] or 0
        accomodation_expenses = incomes_data.aggregate(accomodation_expenses = Sum('accomodation_expenses'))['accomodation_expenses'] or 0
        monitoring_expenses = incomes_data.aggregate(monitoring_expenses = Sum('monitoring_expenses'))['monitoring_expenses'] or 0
        miscellaneous_expenses = incomes_data.aggregate(miscellaneous_expenses = Sum('miscellaneous_expenses'))['miscellaneous_expenses'] or 0
        

        incomes = [
            {'name' : 'Human Resource', 'y': human_resource},
            {'name' : 'Camp Expenses', 'y' : camp_expenses},
            {'name' : 'Training Expenses', 'y' : training_expenses},
            {'name' : 'Equipment Expenses', 'y' : equipment_expenses},
            {'name' : 'Travel Expenses', 'y' : travel_expenses},
            {'name' : 'Material Expences', 'y' : material_expences},
            {'name' : 'Administrative Expenses', 'y' : administrative_expenses},
            {'name' : 'Accomodation Expenses', 'y' : accomodation_expenses},
            {'name' : 'Monitoring Expenses', 'y' : monitoring_expenses},
            {'name' : 'Miscellaneous Expenses', 'y' : miscellaneous_expenses},
        ]

        return JsonResponse({
            'income_result': incomes
        }, safe=False)
        



class IncomeExpenditureChartView(LoginRequiredMixin, View):

    def get(self, request):
        
        incomes_data = Incomes.objects.all()
        hr_amount = HRExpenditure.objects.all()
        equipment_amount = EquipmentExpenditure.objects.all()
        travel_amount = TravelExpenditure.objects.all()
        iec_amount = IECExpenditure.objects.all()
        accommodation_amount = AccommodationExpenditure.objects.all()
        miscellaneous_amount = MiscellaneousExpenditure.objects.all()

        if 'project' in request.GET and request.GET['project'] != "All":
            incomes_data = incomes_data.filter(project_id = request.GET['project'])
            hr_amount = HRExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            equipment_amount = EquipmentExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            travel_amount = TravelExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            iec_amount = IECExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            accommodation_amount = AccommodationExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            miscellaneous_amount = MiscellaneousExpenditure.objects.filter(expenditure__project_id = request.GET['project'])
            
        if 'date' in request.GET and request.GET['date'] != "":
            incomes_data = incomes_data.filter(payment_date = request.GET['date'])
            hr_amount = hr_amount.filter(hr_expence_date = request.GET['date'])
            equipment_amount = equipment_amount.filter(equipment_expence_date = request.GET['date'])
            travel_amount = travel_amount.filter(travel_expence_date = request.GET['date'])
            iec_amount = iec_amount.filter(iec_expence_date = request.GET['date'])
            accomodation_amount = accomodation_amount.filter(accomodation_expence_date = request.GET['date'])
            miscellaneous_amount = miscellaneous_amount.filter(miscellaneous_expence_date = request.GET['date'])
            
        human_resource = incomes_data.aggregate(human_resource = Sum('human_resource'))['human_resource'] or 0
        equipment_expenses = incomes_data.aggregate(equipment_expenses = Sum('equipment_expenses'))['equipment_expenses'] or 0
        travel_expenses = incomes_data.aggregate(travel_expenses = Sum('travel_expenses'))['travel_expenses'] or 0
        material_expences = incomes_data.aggregate(material_expences = Sum('material_expences'))['material_expences'] or 0
        accomodation_expenses = incomes_data.aggregate(accomodation_expenses = Sum('accomodation_expenses'))['accomodation_expenses'] or 0
        miscellaneous_expenses = incomes_data.aggregate(miscellaneous_expenses = Sum('miscellaneous_expenses'))['miscellaneous_expenses'] or 0
        
        hr_amount = hr_amount.aggregate(hr_amount = Sum('hr_amount'))['hr_amount'] or 0
        equipment_amount = equipment_amount.aggregate(equipment_amount = Sum('equipment_amount'))['equipment_amount'] or 0
        travel_amount = travel_amount.aggregate(travel_amount = Sum('travel_amount'))['travel_amount'] or 0
        iec_amount = iec_amount.aggregate(iec_amount = Sum('iec_amount'))['iec_amount'] or 0
        accommodation_amount = accommodation_amount.aggregate(accommodation_amount = Sum('accommodation_amount'))['accommodation_amount'] or 0
        miscellaneous_amount = miscellaneous_amount.aggregate(miscellaneous_amount = Sum('miscellaneous_amount'))['miscellaneous_amount'] or 0
        
        incomes = [human_resource, equipment_expenses, travel_expenses, material_expences, accomodation_expenses, miscellaneous_expenses]

        amounts = [hr_amount, equipment_amount, travel_amount, iec_amount, accommodation_amount, miscellaneous_amount]

        return JsonResponse({
            'income_result': incomes,
            'amount_result' : amounts
        }, safe=False)
        
