"""
Custom management command to set up BinByte after installation.
"""
from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from django.db import transaction
from apps.business.models import Business, Location, BusinessSettings
from apps.authentication.models import Role, UserProfile, BusinessMembership

User = get_user_model()

class Command(BaseCommand):
    help = 'Set up BinByte with initial data'
    
    def add_arguments(self, parser):
        parser.add_argument(
            '--business-name',
            type=str,
            help='Name of the business to create',
            default='Demo Business'
        )
        parser.add_argument(
            '--admin-email',
            type=str,
            help='Email for the admin user',
            required=True
        )
        parser.add_argument(
            '--admin-password',
            type=str,
            help='Password for the admin user',
            default='admin123'
        )
    
    def handle(self, *args, **options):
        with transaction.atomic():
            self.stdout.write('Setting up BinByte...')
            
            # Create admin user
            admin_user = self.create_admin_user(
                options['admin_email'],
                options['admin_password']
            )
            
            # Create business
            business = self.create_business(options['business_name'])
            
            # Create roles
            admin_role = self.create_roles()
            
            # Create business membership
            self.create_business_membership(admin_user, business, admin_role)
            
            # Create default location
            self.create_default_location(business)
            
            # Create business settings
            self.create_business_settings(business)
            
            self.stdout.write(
                self.style.SUCCESS(f'BinByte setup completed successfully!')
            )
            self.stdout.write(f'Admin user: {options["admin_email"]}')
            self.stdout.write(f'Business: {business.name}')
    
    def create_admin_user(self, email, password):
        """Create admin user."""
        if User.objects.filter(email=email).exists():
            self.stdout.write(f'User {email} already exists')
            return User.objects.get(email=email)
        
        user = User.objects.create_user(
            username=email,
            email=email,
            password=password,
            first_name='Admin',
            last_name='User',
            is_staff=True,
            is_superuser=True
        )
        
        # Create profile
        UserProfile.objects.create(user=user)
        
        self.stdout.write(f'Created admin user: {email}')
        return user
    
    def create_business(self, name):
        """Create business."""
        business, created = Business.objects.get_or_create(
            name=name,
            defaults={
                'slug': name.lower().replace(' ', '-'),
                'email': 'contact@example.com',
                'phone_number': '+1234567890',
                'address_line_1': '123 Business St',
                'city': 'Business City',
                'state': 'BC',
                'postal_code': '12345',
                'country': 'US',
            }
        )
        
        if created:
            self.stdout.write(f'Created business: {name}')
        else:
            self.stdout.write(f'Business {name} already exists')
        
        return business
    
    def create_roles(self):
        """Create default roles."""
        admin_role, created = Role.objects.get_or_create(
            name='Admin',
            defaults={
                'description': 'Full system access',
                'permissions': {
                    'inventory': ['create', 'read', 'update', 'delete'],
                    'sales': ['create', 'read', 'update', 'delete'],
                    'reporting': ['create', 'read', 'update', 'delete'],
                    'users': ['create', 'read', 'update', 'delete'],
                }
            }
        )
        
        manager_role, created = Role.objects.get_or_create(
            name='Manager',
            defaults={
                'description': 'Management level access',
                'permissions': {
                    'inventory': ['create', 'read', 'update'],
                    'sales': ['create', 'read', 'update'],
                    'reporting': ['read'],
                }
            }
        )
        
        staff_role, created = Role.objects.get_or_create(
            name='Staff',
            defaults={
                'description': 'Basic staff access',
                'permissions': {
                    'inventory': ['read', 'update'],
                    'sales': ['create', 'read'],
                }
            }
        )
        
        self.stdout.write('Created default roles')
        return admin_role
    
    def create_business_membership(self, user, business, role):
        """Create business membership."""
        membership, created = BusinessMembership.objects.get_or_create(
            user=user,
            business=business,
            defaults={'role': role}
        )
        
        if created:
            self.stdout.write(f'Created business membership for {user.email}')
    
    def create_default_location(self, business):
        """Create default location."""
        location, created = Location.objects.get_or_create(
            business=business,
            code='MAIN',
            defaults={
                'name': 'Main Location',
                'address_line_1': '123 Main St',
                'city': 'Main City',
                'state': 'MC',
                'postal_code': '12345',
                'country': 'US',
                'is_warehouse': True,
                'is_store': True,
            }
        )
        
        if created:
            self.stdout.write('Created default location')
    
    def create_business_settings(self, business):
        """Create business settings."""
        settings, created = BusinessSettings.objects.get_or_create(
            business=business,
            defaults={
                'auto_generate_sku': True,
                'sku_prefix': 'BB',
                'low_stock_threshold': 10,
                'auto_invoice_generation': True,
                'invoice_prefix': 'INV',
                'quote_prefix': 'QUO',
            }
        )
        
        if created:
            self.stdout.write('Created business settings')
