from apps.livestock.models import LiveStockType
from apps.product.models import QuotaUsage, IncentivePlan


class QuotaUsageService:

    @staticmethod
    def allocate_usage(rancher, distribution, item_data, quota_stat=None):
        """ save & calculate quota usage of rancher """

        # purchase quota usage of rancher
        if 'livestock_statistic' in item_data.keys():  # noqa

            # get list of livestock types object for transaction item
            livestock_types = {
                lt.en_name: lt
                for lt in LiveStockType.objects.filter(
                    en_name__in=[i['name'] for i in item_data.get('livestock_statistic', [])]
                )
            }

            # get list of incentive plans object for transaction item
            incentive_plans = {
                iplan.id: iplan
                for iplan in IncentivePlan.objects.all()
            }

            usages = []  # list of usages objects
            for item in item_data['livestock_statistic']:
                # get livestock by en name
                livestock_type = livestock_types.get(item['name'])
                if not livestock_types:
                    continue

                # true or false
                is_incentive = item['id'] != 0

                # get usage & calculate
                usage, created = QuotaUsage.objects.get_or_create(
                    rancher=rancher,
                    livestock_type=livestock_type,
                    distribution=distribution,
                    quota_stat=quota_stat,
                    incentive_plan=incentive_plans.get(item['id']) if is_incentive else None,
                    defaults={
                        "count": item['count'],
                        'usage_type': 'incentive' if is_incentive else 'base',
                        'incentive_quota_used': item['total_weight'] if is_incentive else 0,
                        'base_quota_used': item['total_weight'] if is_incentive else 0
                    }
                )

                if not created:
                    if usage.usage_type == 'incentive':
                        usage.incentive_quota_used += item['total_weight']
                    else:
                        usage.base_quota_used += item['total_weight']
                    usage.save()

                usages.append(usage)

            return usages
