from django.core.management.base import BaseCommand
from apps.complaints.models import ComplaintCategory


class Command(BaseCommand):
    help = 'Load default complaint categories and subcategories'

    def handle(self, *args, **options):
        """Create default complaint categories with subcategories"""

        # Define categories and subcategories
        categories_data = [
            {
                'code': 'quality_care',
                'name_en': 'Quality of Care & Treatment',
                'name_ar': 'جودة الرعاية والعلاج',
                'description_en': 'This is for concerns about the actual medical help received.',
                'description_ar': 'هذا للمخاوف المتعلقة بالمساعدة الطبية الفعلية المتلقاة.',
                'order': 1,
                'subcategories': [
                    {
                        'code': 'diagnosis',
                        'name_en': 'Diagnosis concerns',
                        'name_ar': 'مخاوف التشخيص',
                        'description_en': 'Feeling that a condition was missed or incorrectly identified.',
                        'description_ar': 'الشعور بأن الحالة تم تفويتها أو تحديدها بشكل غير صحيح.',
                        'order': 1
                    },
                    {
                        'code': 'treatment_effectiveness',
                        'name_en': 'Treatment effectiveness',
                        'name_ar': 'فعالية العلاج',
                        'description_en': 'Feeling that the treatment didn\'t work or made things worse.',
                        'description_ar': 'الشعور بأن العلاج لم يعمل أو جعل الأمور أسوأ.',
                        'order': 2
                    },
                    {
                        'code': 'safety_errors',
                        'name_en': 'Safety & Errors',
                        'name_ar': 'السلامة والأخطاء',
                        'description_en': 'Concerns about medication mistakes, falls, or surgical complications.',
                        'description_ar': 'مخاوف بشأن أخطاء الأدوية، أو السقوط، أو مضاعفات الجراحة.',
                        'order': 3
                    },
                    {
                        'code': 'pain_management',
                        'name_en': 'Pain management',
                        'name_ar': 'إدارة الألم',
                        'description_en': 'Feeling that pain was not taken seriously or handled well.',
                        'description_ar': 'الشعور بأن الألم لم يؤخذ بجدية أو تم التعامل معه بشكل جيد.',
                        'order': 4
                    }
                ]
            },
            {
                'code': 'communication',
                'name_en': 'Communication & Information',
                'name_ar': 'التواصل والمعلومات',
                'description_en': 'This covers how staff spoke to the patient and the clarity of information provided.',
                'description_ar': 'يغطي هذا كيف تحدث الموظفون مع المريض ووضوح المعلومات المقدمة.',
                'order': 2,
                'subcategories': [
                    {
                        'code': 'staff_attitude',
                        'name_en': 'Staff attitude',
                        'name_ar': 'سلوك الموظفين',
                        'description_en': 'Feeling that staff were rude, dismissive, or lacked empathy.',
                        'description_ar': 'الشعور بأن الموظفين كانوا غير مهذبين، أو متعالين، أو يفتقرون إلى التعاطف.',
                        'order': 1
                    },
                    {
                        'code': 'lack_information',
                        'name_en': 'Lack of information',
                        'name_ar': 'نقص المعلومات',
                        'description_en': 'Not being told enough about a procedure, risks, or "what happens next."',
                        'description_ar': 'عدم إخبارهم بما يكفي عن إجراء، أو المخاطر، أو "ماذا يحدث بعد ذلك".',
                        'order': 2
                    },
                    {
                        'code': 'language_listening',
                        'name_en': 'Language & Listening',
                        'name_ar': 'اللغة والاستماع',
                        'description_en': 'Difficulty being understood or feeling that doctors didn\'t listen to the patient\'s concerns.',
                        'description_ar': 'صعوبة فهمهم أو الشعور بأن الأطباء لم يستمعوا لاهتمامات المريض.',
                        'order': 3
                    }
                ]
            },
            {
                'code': 'access_timing',
                'name_en': 'Access & Timing',
                'name_ar': 'الوصول والتوقيت',
                'description_en': 'These are "logistical" complaints regarding the patient\'s schedule and ability to get care.',
                'description_ar': 'هذه شكاوى "لوجستية" تتعلق بجدول المريض وقدرته على الحصول على الرعاية.',
                'order': 3,
                'subcategories': [
                    {
                        'code': 'waiting_times',
                        'name_en': 'Waiting times',
                        'name_ar': 'أوقات الانتظار',
                        'description_en': 'Long delays in the waiting room or waiting too long for a scheduled surgery.',
                        'description_ar': 'تأخير طويل في غرفة الانتظار أو الانتظار لفترة طويلة جداً لعملية جراحية مجدولة.',
                        'order': 1
                    },
                    {
                        'code': 'appointment_issues',
                        'name_en': 'Appointment issues',
                        'name_ar': 'مشاكل المواعيد',
                        'description_en': 'Difficulty booking an appointment or having one cancelled at the last minute.',
                        'description_ar': 'صعوبة حجز موعد أو إلغاء موعد في اللحظة الأخيرة.',
                        'order': 2
                    },
                    {
                        'code': 'referrals',
                        'name_en': 'Referrals',
                        'name_ar': 'الإحالات',
                        'description_en': 'Problems getting sent to a specialist or another hospital.',
                        'description_ar': 'مشاكل في الإحالة إلى أخصائي أو مستشفى آخر.',
                        'order': 3
                    }
                ]
            },
            {
                'code': 'facility_environment',
                'name_en': 'Facility & Environment',
                'name_ar': 'المرفق والبيئة',
                'description_en': 'This focuses on the physical space where care was provided.',
                'description_ar': 'يركز هذا على المساحة المادية حيث تم تقديم الرعاية.',
                'order': 4,
                'subcategories': [
                    {
                        'code': 'cleanliness',
                        'name_en': 'Cleanliness',
                        'name_ar': 'النظافة',
                        'description_en': 'Issues with the hygiene of rooms, bathrooms, or equipment.',
                        'description_ar': 'مشاكل في نظافة الغرف، أو الحمامات، أو المعدات.',
                        'order': 1
                    },
                    {
                        'code': 'food_catering',
                        'name_en': 'Food & Catering',
                        'name_ar': 'الطعام والتموين',
                        'description_en': 'Poor quality or incorrect meals during a hospital stay.',
                        'description_ar': 'جودة رديئة أو وجبات غير صحيحة خلال إقامة المستشفى.',
                        'order': 2
                    },
                    {
                        'code': 'environment',
                        'name_en': 'Environment',
                        'name_ar': 'البيئة',
                        'description_en': 'Issues with noise levels, room temperature, or parking.',
                        'description_ar': 'مشاكل مع مستويات الضوضاء، أو درجة حرارة الغرفة، أو مواقف السيارات.',
                        'order': 3
                    }
                ]
            },
            {
                'code': 'rights_privacy_billing',
                'name_en': 'Rights, Privacy & Billing',
                'name_ar': 'الحقوق والخصوصية والفواتير',
                'description_en': 'These involve the administrative and ethical side of the healthcare experience.',
                'description_ar': 'هذه تتضمن الجانب الإداري والأخلاقي لتجربة الرعاية الصحية.',
                'order': 5,
                'subcategories': [
                    {
                        'code': 'privacy_confidentiality',
                        'name_en': 'Privacy & Confidentiality',
                        'name_ar': 'الخصوصية والسرية',
                        'description_en': 'Feeling that personal medical information was shared inappropriately.',
                        'description_ar': 'الشعور بأن المعلومات الطبية الشخصية تم مشاركتها بشكل غير مناسب.',
                        'order': 1
                    },
                    {
                        'code': 'consent',
                        'name_en': 'Consent',
                        'name_ar': 'الموافقة',
                        'description_en': 'Feeling pressured into a decision or not being asked for permission before a treatment.',
                        'description_ar': 'الشعور بالضغط لاتخاذ قرار أو عدم طلب الإذن قبل العلاج.',
                        'order': 2
                    },
                    {
                        'code': 'billing_costs',
                        'name_en': 'Billing & Costs',
                        'name_ar': 'الفواتير والتكاليف',
                        'description_en': 'Confusion or disagreement over charges and insurance.',
                        'description_ar': 'الارتباك أو الخلاف حول الرسوم والتأمين.',
                        'order': 3
                    }
                ]
            }
        ]

        # Create categories
        created_count = 0
        updated_count = 0

        for category_data in categories_data:
            subcategories_data = category_data.pop('subcategories', None)

            # Get or create category (system-wide - no hospitals assigned)
            category, created = ComplaintCategory.objects.update_or_create(
                code=category_data['code'],
                defaults=category_data
            )

            if created:
                created_count += 1
                self.stdout.write(
                    self.style.SUCCESS(f'Created category: {category.name_en}')
                )
            else:
                updated_count += 1
                self.stdout.write(
                    self.style.WARNING(f'Updated category: {category.name_en}')
                )

            # Create subcategories
            if subcategories_data:
                for subcat_data in subcategories_data:
                    subcat, sub_created = ComplaintCategory.objects.update_or_create(
                        code=subcat_data['code'],
                        parent=category,
                        defaults=subcat_data
                    )

                    if sub_created:
                        created_count += 1
                        self.stdout.write(
                            self.style.SUCCESS(f'  Created subcategory: {subcat.name_en}')
                        )
                    else:
                        updated_count += 1
                        self.stdout.write(
                            self.style.WARNING(f'  Updated subcategory: {subcat.name_en}')
                        )

        self.stdout.write(
            self.style.SUCCESS(
                f'\nDone! Created {created_count} items, updated {updated_count} items.'
            )
        )
