"""
Django management command to create initial user, business, industry, and membership.

Usage:
    python manage.py setup_initial_data

This creates:
- Electronics industry
- Peter user (owner)
- OneTech Computers business
- Business membership linking Peter to OneTech
- Business settings with default configurations
"""

from django.core.management.base import BaseCommand
from django.db import transaction
from django.utils import timezone
from datetime import timedelta
from decimal import Decimal

from apps.authentication.models import User, Role, Permission, RolePermission
from apps.business.models import Business, BusinessMembership, BusinessSettings, Location
from apps.inventory.models import Industry


class Command(BaseCommand):
    help = 'Create initial user, business, industry, and membership setup'

    def handle(self, *args, **options):
        try:
            with transaction.atomic():
                self.stdout.write(self.style.WARNING('Starting initial setup...'))
                
                # 1. Create Electronics Industry
                industry = self.create_industry()
                self.stdout.write(self.style.SUCCESS(f'✓ Created industry: {industry.name}'))
                
                # 2. Create Owner Role (System Role)
                owner_role = self.create_owner_role()
                self.stdout.write(self.style.SUCCESS(f'✓ Created role: {owner_role.display_name}'))
                
                # 3. Create User (Peter)
                user = self.create_user()
                self.stdout.write(self.style.SUCCESS(f'✓ Created user: {user.get_full_name()} ({user.email})'))
                
                # 4. Create Business (OneTech Computers)
                business = self.create_business(user, industry)
                self.stdout.write(self.style.SUCCESS(f'✓ Created business: {business.name}'))
                
                # 5. Create Business Settings
                settings = self.create_business_settings(business)
                self.stdout.write(self.style.SUCCESS(f'✓ Created business settings'))
                
                # 6. Create Primary Location
                location = self.create_primary_location(business)
                self.stdout.write(self.style.SUCCESS(f'✓ Created primary location: {location.name}'))
                
                # 7. Create Business-specific Owner Role
                business_owner_role = self.create_business_owner_role(business, owner_role)
                self.stdout.write(self.style.SUCCESS(f'✓ Created business owner role'))
                
                # 8. Create Business Membership
                membership = self.create_membership(user, business, business_owner_role)
                self.stdout.write(self.style.SUCCESS(f'✓ Created business membership'))
                
                # Summary
                self.stdout.write(self.style.SUCCESS('\n' + '='*60))
                self.stdout.write(self.style.SUCCESS('SETUP COMPLETE!'))
                self.stdout.write(self.style.SUCCESS('='*60))
                self.stdout.write(f'\nLogin Credentials:')
                self.stdout.write(f'  Email: sadamin@gmail.com')
                self.stdout.write(f'  Password: sadmin@231')
                self.stdout.write(f'\nBusiness Details:')
                self.stdout.write(f'  Name: OneTech Computers')
                self.stdout.write(f'  Industry: Electronics')
                self.stdout.write(f'  Owner: Peter')
                self.stdout.write(f'  Currency: KES (Kenyan Shilling)')
                self.stdout.write(f'  Commission Rate: 7%')
                self.stdout.write('\n')
                
        except Exception as e:
            self.stdout.write(self.style.ERROR(f'✗ Error during setup: {str(e)}'))
            raise

    def create_industry(self):
        """Create Electronics industry"""
        industry, created = Industry.objects.get_or_create(
            slug='electronics',
            defaults={
                'name': 'Electronics',
                'icon': 'laptop',
                'description': 'Electronics and computer hardware wholesale and retail',
                'is_active': True,
                'display_order': 1,
                'default_unit_of_measure': 'pieces',
                'requires_serial_tracking': True,
                'requires_batch_tracking': False,
                'requires_expiry_tracking': False,
                'metadata': {
                    'business_type': 'wholesale',
                    'typical_products': ['laptops', 'computers', 'accessories', 'peripherals'],
                    'warranty_tracking': True
                }
            }
        )
        return industry

    def create_owner_role(self):
        """Create system-level Owner role"""
        role, created = Role.objects.get_or_create(
            name='OWNER',
            business=None,  # System role
            defaults={
                'display_name': 'Business Owner',
                'description': 'Full access to all business operations and settings',
                'is_system_role': True
            }
        )
        
        if created:
            # Create all permissions for owner role
            self.create_owner_permissions(role)
        
        return role

    def create_owner_permissions(self, role):
        """Create all permissions for owner role"""
        resources = [
            'inventory', 'sales', 'invoicing', 'customers', 
            'transfers', 'warranty', 'reports', 'accounting', 
            'users', 'settings'
        ]
        actions = [
            'view', 'read', 'create', 'edit', 'update', 
            'delete', 'approve', 'export', 'record_payment',
            'manage_templates', 'manage_reminders', 'view_reports'
        ]
        
        for resource in resources:
            for action in actions:
                try:
                    permission, created = Permission.objects.get_or_create(
                        resource=resource,
                        action=action,
                        defaults={
                            'description': f'{action.title()} {resource}'
                        }
                    )
                    
                    # Link permission to role
                    RolePermission.objects.get_or_create(
                        role=role,
                        permission=permission
                    )
                except Exception:
                    # Skip if combination doesn't exist in RESOURCE_TYPES or ACTION_TYPES
                    pass

    def create_user(self):
        """Create Peter user"""
        user, created = User.objects.get_or_create(
            email='sadamin@gmail.com',
            defaults={
                'username': 'peter_admin',
                'first_name': 'Peter',
                'last_name': 'Admin',
                'is_active': True,
                'is_staff': True,
                'is_superuser': False,
                'is_email_verified': True,
                'is_phone_verified': False,
                'onboarding_completed': True,
                'onboarding_step': 5,
                'profile_completed': True,
                'business_setup_completed': True,
            }
        )
        
        if created:
            user.set_password('sadmin@231')
            user.save()
        
        return user

    def create_business(self, user, industry):
        """Create OneTech Computers business"""
        business, created = Business.objects.get_or_create(
            name='OneTech Computers',
            defaults={
                'legal_name': 'OneTech Computers Limited',
                'registration_number': 'OTC-2024-001',
                'email': 'info@onetechcomputers.co.ke',
                'phone_number': '+254712345678',
                'website': 'https://onetechcomputers.co.ke',
                'industry': industry,
                'industry_configuration': {
                    'business_type': 'wholesale',
                    'enable_warranty_tracking': True,
                    'enable_serial_tracking': True,
                    'default_warranty_period': 365
                },
                'address_line1': 'Moi Avenue',
                'address_line2': 'City Center Building, 3rd Floor',
                'city': 'Nairobi',
                'state': 'Nairobi County',
                'postal_code': '00100',
                'country': 'Kenya',
                'business_code': 'OTC001',
                'status': 'ACTIVE',
                'is_active': True,
                'logo': None,
                'primary_color': '#1E40AF',
                'tax_id': 'P051234567X',
                'currency': 'KES',
                'timezone': 'Africa/Nairobi',
                'is_verified': True,
                'onboarding_completed': True,
                'owner': user
            }
        )
        return business

    def create_business_settings(self, business):
        """Create business settings with commission rate"""
        settings, created = BusinessSettings.objects.get_or_create(
            business=business,
            defaults={
                # Currency & Localization
                'currency': 'KES',
                'currency_symbol': 'KSh',
                'date_format': 'DD/MM/YYYY',
                'time_format': '24',
                'timezone': 'Africa/Nairobi',
                
                # Inventory Settings
                'low_stock_threshold': 30,
                'enable_serial_number_tracking': True,
                'enable_asset_id_tracking': True,
                'auto_generate_asset_id': True,
                'asset_id_prefix': 'OTC',
                
                # Financial Settings
                'default_tax_rate': Decimal('16.00'),  # Kenya VAT
                'enable_customer_credit': True,
                'max_credit_limit': Decimal('100000.00'),
                
                # Commission Settings (7%)
                'enable_commission': True,
                'default_commission_rate': Decimal('7.00'),
                
                # Notification Settings
                'enable_email_notifications': True,
                'enable_sms_notifications': True,
                'enable_low_stock_alerts': True,
                'enable_warranty_expiry_alerts': True,
                
                # Report Settings
                'enable_automated_reports': True,
                'monthly_report_day': 1,
                'report_recipients': ['sadamin@gmail.com'],
                
                # Advanced Features
                'enable_multi_currency': False,
                'enable_barcode_scanning': True,
                'enable_warranty_tracking': True,
                
                # Payment Terms
                'default_payment_terms': 30,
                'default_warranty_period': 365,
                'warranty_reminder_days': 30,
                
                # Features
                'features': {
                    'inventory_management': True,
                    'sales_management': True,
                    'customer_management': True,
                    'warranty_tracking': True,
                    'transfer_management': True,
                    'reporting': True,
                    'multi_location': True
                }
            }
        )
        return settings

    def create_primary_location(self, business):
        """Create primary business location"""
        location, created = Location.objects.get_or_create(
            business=business,
            code='OTC-MAIN-001',
            defaults={
                'name': 'Main Warehouse',
                'location_type': 'WAREHOUSE',
                'is_primary': True,
                'is_main': True,
                'phone': '+254712345678',
                'email': 'warehouse@onetechcomputers.co.ke',
                'address': 'Moi Avenue, City Center Building',
                'address_line1': 'Moi Avenue',
                'address_line2': 'City Center Building, Ground Floor',
                'city': 'Nairobi',
                'state': 'Nairobi County',
                'postal_code': '00100',
                'country': 'Kenya',
                'capacity': 10000,
                'latitude': Decimal('-1.286389'),
                'longitude': Decimal('36.817223'),
                'is_active': True,
                'operating_hours': {
                    'monday': {'open': '08:00', 'close': '18:00'},
                    'tuesday': {'open': '08:00', 'close': '18:00'},
                    'wednesday': {'open': '08:00', 'close': '18:00'},
                    'thursday': {'open': '08:00', 'close': '18:00'},
                    'friday': {'open': '08:00', 'close': '18:00'},
                    'saturday': {'open': '09:00', 'close': '17:00'},
                    'sunday': {'closed': True}
                }
            }
        )
        return location

    def create_business_owner_role(self, business, system_role):
        """Create business-specific owner role"""
        role, created = Role.objects.get_or_create(
            name='OWNER',
            business=business,
            defaults={
                'display_name': 'Business Owner',
                'description': 'Full access to all business operations',
                'is_system_role': False
            }
        )
        
        if created:
            # Copy all permissions from system role
            system_permissions = RolePermission.objects.filter(role=system_role)
            for perm in system_permissions:
                RolePermission.objects.get_or_create(
                    role=role,
                    permission=perm.permission
                )
        
        return role

    def create_membership(self, user, business, role):
        """Create business membership for Peter"""
        membership, created = BusinessMembership.objects.get_or_create(
            user=user,
            business=business,
            defaults={
                'role': role,
                'status': 'ACTIVE',
                'is_primary': True,
                'can_access_all_locations': True,
                'permissions': {},
                'invitation_token': None,
                'invitation_sent_at': None,
                'invitation_accepted_at': timezone.now(),
                'invited_by': None,
                'status_changed_at': timezone.now(),
                'status_changed_by': None,
                'status_reason': 'Initial setup - Business owner',
                'all_locations_access': True,
                'is_active': True,
                'invitation_accepted': True,
                'last_accessed_at': timezone.now()
            }
        )
        return membership