from django.core.management.base import BaseCommand
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from contract.models import (
    User, Input, Contract, ContractInput, Loan, Payment, 
    MarketplaceProduct, PostingFee, Sale, AggregationCentre, 
    FieldOfficerAssignment, UserAddress, InputShopPickupStation
)

class Command(BaseCommand):
    help = 'Set up groups and permissions for the contract app'

    def handle(self, *args, **options):
        # Define groups
        admin_group, _ = Group.objects.get_or_create(name='Admins')
        field_officer_group, _ = Group.objects.get_or_create(name='Field Officers')
        farmer_group, _ = Group.objects.get_or_create(name='Farmers')
        buyer_group, _ = Group.objects.get_or_create(name='Buyers')
        business_person_group, _ = Group.objects.get_or_create(name='Business Persons')

        # Define models and their permissions
        models = [
            User, Input, Contract, ContractInput, Loan, Payment, 
            MarketplaceProduct, PostingFee, Sale, AggregationCentre, 
            FieldOfficerAssignment, UserAddress, InputShopPickupStation
        ]

        # Permissions for each group
        admin_permissions = []
        field_officer_permissions = []
        farmer_permissions = []
        buyer_permissions = []
        business_person_permissions = []

        for model in models:
            content_type = ContentType.objects.get_for_model(model)
            app_label = content_type.app_label  # Get the app_label (e.g., 'contract')

            # Get all permissions for this model
            permissions = Permission.objects.filter(content_type=content_type)

            # Admin gets all permissions
            admin_permissions.extend(permissions)

            # Model-specific permissions
            model_name = model.__name__.lower()

            if model_name == 'user':
                farmer_permissions.extend(permissions.filter(codename__in=['view_user', 'change_user']))
                buyer_permissions.extend(permissions.filter(codename__in=['view_user', 'change_user']))
                business_person_permissions.extend(permissions.filter(codename__in=['view_user', 'change_user']))
                field_officer_permissions.extend(permissions.filter(codename__in=['view_user']))

            elif model_name == 'input':
                farmer_permissions.extend(permissions.filter(codename__in=['view_input']))
                buyer_permissions.extend(permissions.filter(codename__in=['view_input']))
                business_person_permissions.extend(permissions.filter(codename__in=['view_input']))
                field_officer_permissions.extend(permissions.filter(codename='view_input'))
                admin_permissions.extend(permissions)

            elif model_name == 'contract':
                farmer_permissions.extend(permissions.filter(codename__in=['add_contract', 'view_contract', 'change_contract']))
                field_officer_permissions.extend(permissions.filter(codename='view_contract'))
                admin_permissions.extend(permissions)

            elif model_name == 'contractinput':
                farmer_permissions.extend(permissions.filter(codename__in=['view_contractinput']))
                field_officer_permissions.extend(permissions.filter(codename='view_contractinput'))
                admin_permissions.extend(permissions)

            elif model_name == 'loan':
                farmer_permissions.extend(permissions.filter(codename__in=['view_loan']))
                field_officer_permissions.extend(permissions.filter(codename='view_loan'))
                admin_permissions.extend(permissions)

            elif model_name == 'payment':
                farmer_permissions.extend(permissions.filter(codename__in=['view_payment']))
                buyer_permissions.extend(permissions.filter(codename__in=['add_payment', 'view_payment']))
                admin_permissions.extend(permissions)

            elif model_name == 'marketplaceproduct':
                business_person_permissions.extend(permissions.filter(codename__in=['add_marketplaceproduct', 'view_marketplaceproduct', 'change_marketplaceproduct', 'delete_marketplaceproduct']))
                buyer_permissions.extend(permissions.filter(codename='view_marketplaceproduct'))
                admin_permissions.extend(permissions)

            elif model_name == 'postingfee':
                business_person_permissions.extend(permissions.filter(codename__in=['add_postingfee', 'view_postingfee']))
                admin_permissions.extend(permissions)

            elif model_name == 'sale':
                buyer_permissions.extend(permissions.filter(codename__in=['add_sale', 'view_sale']))
                business_person_permissions.extend(permissions.filter(codename='view_sale'))
                admin_permissions.extend(permissions)

            elif model_name == 'aggregationcentre':
                field_officer_permissions.extend(permissions.filter(codename='view_aggregationcentre'))
                admin_permissions.extend(permissions)

            elif model_name == 'fieldofficerassignment':
                field_officer_permissions.extend(permissions.filter(codename='view_fieldofficerassignment'))
                farmer_permissions.extend(permissions.filter(codename='view_fieldofficerassignment'))
                admin_permissions.extend(permissions)

            elif model_name == 'useraddress':
                buyer_permissions.extend(permissions.filter(codename__in=['add_useraddress', 'view_useraddress', 'change_useraddress', 'delete_useraddress']))
                admin_permissions.extend(permissions)

            elif model_name == 'inputshoppickupstation':
                field_officer_permissions.extend(
                    permissions.filter(
                        codename__in=[
                            'view_inputshoppickupstation',
                            'add_inputshoppickupstation',
                            'change_inputshoppickupstation',
                            'delete_inputshoppickupstation',
                        ]
                    )
                )

        # Assign permissions to groups
        admin_group.permissions.set(admin_permissions)
        field_officer_group.permissions.set(field_officer_permissions)
        farmer_group.permissions.set(farmer_permissions)
        buyer_group.permissions.set(buyer_permissions)
        business_person_group.permissions.set(business_person_permissions)

        self.stdout.write(self.style.SUCCESS('Successfully set up permissions for group Admins'))
        self.stdout.write(self.style.SUCCESS('Successfully set up permissions for group Field Officers'))
        self.stdout.write(self.style.SUCCESS('Successfully set up permissions for group Farmers'))
        self.stdout.write(self.style.SUCCESS('Successfully set up permissions for group Buyers'))
        self.stdout.write(self.style.SUCCESS('Successfully set up permissions for group Business Persons'))
