"""
Django Management Command: Seed All
File: apps/inventory/management/commands/seed_all.py

This command seeds industries and their field definitions in one go.
"""

from django.core.management.base import BaseCommand
from django.db import transaction
from django.db.models import ProtectedError
from apps.inventory.models import Industry, FieldDefinition, FieldOption


class Command(BaseCommand):
    help = 'Seed industries and field definitions'

    def add_arguments(self, parser):
        parser.add_argument(
            '--industries-only',
            action='store_true',
            help='Seed only industries without field definitions',
        )
        parser.add_argument(
            '--fields-only',
            action='store_true',
            help='Seed only field definitions',
        )
        parser.add_argument(
            '--industry',
            type=str,
            help='Seed fields for specific industry slug',
        )

    def handle(self, *args, **options):
        industries_only = options.get('industries_only')
        fields_only = options.get('fields_only')
        industry_slug = options.get('industry')

        if not fields_only:
            self.seed_industries()
        
        if not industries_only:
            self.seed_field_definitions(industry_slug)

    def seed_industries(self):
        """Seed or update industries"""
        self.stdout.write(self.style.WARNING('\n=== SEEDING INDUSTRIES ===\n'))
        
        industries_data = [
            {
                'name': 'Computer Hardware',
                'slug': 'computer-hardware',
                'icon': 'computer',
                'description': 'Laptops, desktops, servers, and computer components',
                'default_unit_of_measure': 'pieces',
                'requires_serial_tracking': True,
                'requires_batch_tracking': False,
                'requires_expiry_tracking': False,
                'display_order': 1,
                'metadata': {
                    'common_categories': ['Laptops', 'Desktops', 'Servers', 'Components'],
                    'warranty_applicable': True,
                    'refurbishment_common': True,
                }
            },
            {
                'name': 'Electronics',
                'slug': 'electronics',
                'icon': 'smartphone',
                'description': 'Mobile phones, tablets, accessories, and consumer electronics',
                'default_unit_of_measure': 'pieces',
                'requires_serial_tracking': True,
                'requires_batch_tracking': False,
                'requires_expiry_tracking': False,
                'display_order': 2,
                'metadata': {
                    'common_categories': ['Mobile Phones', 'Tablets', 'Accessories', 'Wearables'],
                    'warranty_applicable': True,
                }
            },
            {
                'name': 'Pharmaceuticals',
                'slug': 'pharmaceuticals',
                'icon': 'pill',
                'description': 'Medicines, drugs, and pharmaceutical products',
                'default_unit_of_measure': 'boxes',
                'requires_serial_tracking': False,
                'requires_batch_tracking': True,
                'requires_expiry_tracking': True,
                'display_order': 3,
                'metadata': {
                    'regulatory_requirements': True,
                    'prescription_required': True,
                    'temperature_sensitive': True,
                }
            },
            {
                'name': 'Fashion & Apparel',
                'slug': 'fashion-apparel',
                'icon': 'shirt',
                'description': 'Clothing, footwear, and fashion accessories',
                'default_unit_of_measure': 'pieces',
                'requires_serial_tracking': False,
                'requires_batch_tracking': False,
                'requires_expiry_tracking': False,
                'display_order': 5,
                'metadata': {
                    'size_variants': True,
                    'color_variants': True,
                    'seasonal_products': True,
                }
            },
        ]

        created_count = 0
        updated_count = 0

        with transaction.atomic():
            for data in industries_data:
                industry, created = Industry.objects.update_or_create(
                    slug=data['slug'],
                    defaults=data
                )
                
                if created:
                    created_count += 1
                    self.stdout.write(self.style.SUCCESS(f'  ✓ Created: {industry.name}'))
                else:
                    updated_count += 1
                    self.stdout.write(self.style.WARNING(f'  ↻ Updated: {industry.name}'))

        self.stdout.write(f'\nIndustries Summary: {created_count} created, {updated_count} updated\n')

    def seed_field_definitions(self, industry_slug=None):
        """Seed field definitions"""
        self.stdout.write(self.style.WARNING('=== SEEDING FIELD DEFINITIONS ===\n'))

        field_definitions = {
            'computer-hardware': self.get_computer_hardware_fields(),
            'electronics': self.get_electronics_fields(),
            'pharmaceuticals': self.get_pharmaceuticals_fields(),
            'fashion-apparel': self.get_fashion_apparel_fields(),
        }

        if industry_slug:
            if industry_slug not in field_definitions:
                self.stdout.write(self.style.ERROR(f'No definitions for: {industry_slug}'))
                return
            field_definitions = {industry_slug: field_definitions[industry_slug]}

        created_count = 0
        updated_count = 0

        with transaction.atomic():
            for slug, fields in field_definitions.items():
                try:
                    industry = Industry.objects.get(slug=slug)
                    self.stdout.write(f'\nProcessing: {industry.name}')
                    
                    for field_data in fields:
                        options_data = field_data.pop('options', [])
                        
                        field, created = FieldDefinition.objects.update_or_create(
                            industry=industry,
                            field_name=field_data['field_name'],
                            defaults=field_data
                        )
                        
                        if created:
                            created_count += 1
                            self.stdout.write(self.style.SUCCESS(f'  ✓ {field.display_label}'))
                        else:
                            updated_count += 1
                            self.stdout.write(self.style.WARNING(f'  ↻ {field.display_label}'))
                        
                        if options_data:
                            self.create_field_options(field, options_data)
                
                except Industry.DoesNotExist:
                    self.stdout.write(self.style.ERROR(f'Industry not found: {slug}'))

        self.stdout.write(f'\n{"="*60}')
        self.stdout.write(self.style.SUCCESS('SUMMARY:'))
        self.stdout.write(f'  Field definitions created: {created_count}')
        self.stdout.write(f'  Field definitions updated: {updated_count}')
        self.stdout.write(f'  Total: {FieldDefinition.objects.count()}')
        self.stdout.write(f'{"="*60}\n')

    def create_field_options(self, field_definition, options_data):
        """Create options for SELECT fields"""
        for idx, option in enumerate(options_data):
            FieldOption.objects.update_or_create(
                field_definition=field_definition,
                value=option['value'],
                defaults={
                    'display_label': option.get('display_label', option['value']),
                    'display_order': idx,
                    'is_active': True,
                    'metadata': option.get('metadata', {})
                }
            )

    def get_computer_hardware_fields(self):
        """Computer Hardware field definitions"""
        return [
            {
                'field_name': 'processor',
                'display_label': 'Processor',
                'field_type': 'TEXT',
                'data_type': 'STRING',
                'is_required': False,
                'is_searchable': True,
                'is_filterable': True,
                'show_in_list_view': True,
                'show_in_detail_view': True,
                'display_order': 1,
                'field_group': 'Technical Specifications',
                'help_text': 'CPU/Processor (e.g., Intel Core i7-12700H)',
                'validation_rules': {'max_length': 200},
                'enable_suggestions': True,
                'min_occurrences': 2,
            },
            {
                'field_name': 'ram',
                'display_label': 'RAM',
                'field_type': 'TEXT',
                'data_type': 'STRING',
                'is_required': False,
                'is_searchable': True,
                'is_filterable': True,
                'show_in_list_view': True,
                'show_in_detail_view': True,
                'display_order': 2,
                'field_group': 'Technical Specifications',
                'help_text': 'RAM (e.g., 16GB DDR4)',
                'validation_rules': {'max_length': 50},
                'enable_suggestions': True,
                'min_occurrences': 2,
            },
            {
                'field_name': 'storage',
                'display_label': 'Storage',
                'field_type': 'TEXT',
                'data_type': 'STRING',
                'is_required': False,
                'is_searchable': True,
                'is_filterable': True,
                'show_in_list_view': True,
                'show_in_detail_view': True,
                'display_order': 3,
                'field_group': 'Technical Specifications',
                'help_text': 'Storage (e.g., 512GB SSD)',
                'validation_rules': {'max_length': 100},
                'enable_suggestions': True,
                'min_occurrences': 2,
            },
            {
                'field_name': 'graphics_card',
                'display_label': 'Graphics Card',
                'field_type': 'TEXT',
                'data_type': 'STRING',
                'is_required': False,
                'is_searchable': True,
                'is_filterable': True,
                'show_in_list_view': False,
                'show_in_detail_view': True,
                'display_order': 4,
                'field_group': 'Technical Specifications',
                'help_text': 'GPU (e.g., NVIDIA RTX 3060)',
                'validation_rules': {'max_length': 200},
                'enable_suggestions': True,
                'min_occurrences': 2,
            },
            {
                'field_name': 'screen_size',
                'display_label': 'Screen Size',
                'field_type': 'TEXT',
                'data_type': 'STRING',
                'is_required': False,
                'is_searchable': True,
                'is_filterable': True,
                'show_in_list_view': True,
                'show_in_detail_view': True,
                'display_order': 5,
                'field_group': 'Display',
                'help_text': 'Display size (e.g., 15.6 inches)',
                'validation_rules': {'max_length': 50},
                'enable_suggestions': True,
                'min_occurrences': 2,
            },
            {
                'field_name': 'operating_system',
                'display_label': 'Operating System',
                'field_type': 'SELECT',
                'data_type': 'STRING',
                'is_required': False,
                'is_searchable': True,
                'is_filterable': True,
                'show_in_list_view': False,
                'show_in_detail_view': True,
                'display_order': 6,
                'field_group': 'Software',
                'help_text': 'Operating system',
                'validation_rules': {},
                'enable_suggestions': False,
                'options': [
                    {'value': 'windows_11', 'display_label': 'Windows 11'},
                    {'value': 'windows_10', 'display_label': 'Windows 10'},
                    {'value': 'macos', 'display_label': 'macOS'},
                    {'value': 'linux', 'display_label': 'Linux'},
                    {'value': 'dos', 'display_label': 'DOS/No OS'},
                ]
            },
        ]

    def get_electronics_fields(self):
        """Electronics field definitions"""
        return [
            {
                'field_name': 'processor',
                'display_label': 'Processor/Chipset',
                'field_type': 'TEXT',
                'data_type': 'STRING',
                'is_required': False,
                'is_searchable': True,
                'is_filterable': True,
                'show_in_list_view': True,
                'show_in_detail_view': True,
                'display_order': 1,
                'field_group': 'Technical Specifications',
                'help_text': 'Chipset (e.g., Snapdragon 8 Gen 2)',
                'enable_suggestions': True,
                'validation_rules': {},
                'min_occurrences': 2,
            },
            {
                'field_name': 'ram',
                'display_label': 'RAM',
                'field_type': 'TEXT',
                'data_type': 'STRING',
                'is_required': False,
                'is_searchable': True,
                'is_filterable': True,
                'show_in_list_view': True,
                'show_in_detail_view': True,
                'display_order': 2,
                'field_group': 'Technical Specifications',
                'help_text': 'RAM (e.g., 8GB)',
                'enable_suggestions': True,
                'validation_rules': {},
                'min_occurrences': 2,
            },
            {
                'field_name': 'storage',
                'display_label': 'Storage',
                'field_type': 'TEXT',
                'data_type': 'STRING',
                'is_required': False,
                'is_searchable': True,
                'is_filterable': True,
                'show_in_list_view': True,
                'show_in_detail_view': True,
                'display_order': 3,
                'field_group': 'Technical Specifications',
                'help_text': 'Storage (e.g., 128GB)',
                'enable_suggestions': True,
                'validation_rules': {},
                'min_occurrences': 2,
            },
            {
                'field_name': 'screen_size',
                'display_label': 'Screen Size',
                'field_type': 'TEXT',
                'data_type': 'STRING',
                'is_required': False,
                'is_searchable': True,
                'is_filterable': True,
                'show_in_list_view': True,
                'show_in_detail_view': True,
                'display_order': 4,
                'field_group': 'Display',
                'help_text': 'Screen (e.g., 6.7 inches)',
                'enable_suggestions': True,
                'validation_rules': {},
                'min_occurrences': 2,
            },
        ]

    def get_pharmaceuticals_fields(self):
        """Pharmaceuticals field definitions"""
        return [
            {
                'field_name': 'active_ingredient',
                'display_label': 'Active Ingredient',
                'field_type': 'TEXT',
                'data_type': 'STRING',
                'is_required': True,
                'is_searchable': True,
                'is_filterable': True,
                'show_in_list_view': True,
                'show_in_detail_view': True,
                'display_order': 1,
                'field_group': 'Drug Information',
                'help_text': 'Active ingredient',
                'enable_suggestions': True,
                'validation_rules': {},
                'min_occurrences': 2,
            },
            {
                'field_name': 'batch_number',
                'display_label': 'Batch Number',
                'field_type': 'TEXT',
                'data_type': 'STRING',
                'is_required': True,
                'is_searchable': True,
                'is_filterable': True,
                'show_in_list_view': True,
                'show_in_detail_view': True,
                'display_order': 3,
                'field_group': 'Tracking',
                'help_text': 'Batch number',
                'validation_rules': {},
                'enable_suggestions': False,
                'min_occurrences': 2,
            },
        ]

    def get_fashion_apparel_fields(self):
        """Fashion & Apparel field definitions"""
        return [
            {
                'field_name': 'size',
                'display_label': 'Size',
                'field_type': 'SELECT',
                'data_type': 'STRING',
                'is_required': True,
                'is_searchable': False,
                'is_filterable': True,
                'show_in_list_view': True,
                'show_in_detail_view': True,
                'display_order': 1,
                'field_group': 'Product Details',
                'help_text': 'Size',
                'validation_rules': {},
                'enable_suggestions': False,
                'min_occurrences': 2,
                'options': [
                    {'value': 'xs', 'display_label': 'XS'},
                    {'value': 's', 'display_label': 'S'},
                    {'value': 'm', 'display_label': 'M'},
                    {'value': 'l', 'display_label': 'L'},
                    {'value': 'xl', 'display_label': 'XL'},
                ]
            },
            {
                'field_name': 'color',
                'display_label': 'Color',
                'field_type': 'TEXT',
                'data_type': 'STRING',
                'is_required': True,
                'is_searchable': False,
                'is_filterable': True,
                'show_in_list_view': True,
                'show_in_detail_view': True,
                'display_order': 2,
                'field_group': 'Product Details',
                'help_text': 'Color',
                'enable_suggestions': True,
                'validation_rules': {},
                'min_occurrences': 2,
            },
        ]