"""
Management command pour migrer les donnees de SiteConfiguration vers Setting.

Usage:
    python manage.py migrate_site_config --dry-run  # Previsualisation
    python manage.py migrate_site_config            # Migration reelle
    python manage.py migrate_site_config --force    # Ecrase les settings existants
"""
from django.core.management.base import BaseCommand
from django.utils.text import slugify

from cms.models import Setting, SettingType


class Command(BaseCommand):
    help = 'Migre les donnees de SiteConfiguration vers Setting'

    # Mapping des champs SiteConfiguration vers Setting
    FIELD_MAPPING = [
        # General
        {
            'source_field': 'site_name',
            'setting_name': 'Nom du site',
            'setting_slug': 'site-name',
            'setting_type_slug': 'text',
            'category': 'general',
            'order': 1,
            'is_required': True,
        },
        {
            'source_field': 'tagline',
            'setting_name': 'Slogan',
            'setting_slug': 'site-tagline',
            'setting_type_slug': 'text',
            'category': 'general',
            'order': 2,
        },
        # Contact
        {
            'source_field': 'phone',
            'setting_name': 'Telephone',
            'setting_slug': 'site-phone',
            'setting_type_slug': 'phone',
            'category': 'contact',
            'order': 1,
        },
        {
            'source_field': 'email',
            'setting_name': 'Email',
            'setting_slug': 'site-email',
            'setting_type_slug': 'email',
            'category': 'contact',
            'order': 2,
        },
        {
            'source_field': 'address',
            'setting_name': 'Adresse',
            'setting_slug': 'site-address',
            'setting_type_slug': 'textarea',
            'category': 'contact',
            'order': 3,
        },
        # Reseaux sociaux
        {
            'source_field': 'facebook_url',
            'setting_name': 'Facebook',
            'setting_slug': 'social-facebook',
            'setting_type_slug': 'social-url',
            'category': 'social',
            'order': 1,
        },
        {
            'source_field': 'twitter_url',
            'setting_name': 'Twitter / X',
            'setting_slug': 'social-twitter',
            'setting_type_slug': 'social-url',
            'category': 'social',
            'order': 2,
        },
        {
            'source_field': 'linkedin_url',
            'setting_name': 'LinkedIn',
            'setting_slug': 'social-linkedin',
            'setting_type_slug': 'social-url',
            'category': 'social',
            'order': 3,
        },
        {
            'source_field': 'youtube_url',
            'setting_name': 'YouTube',
            'setting_slug': 'social-youtube',
            'setting_type_slug': 'social-url',
            'category': 'social',
            'order': 4,
        },
        # SEO
        {
            'source_field': 'meta_description',
            'setting_name': 'Meta Description',
            'setting_slug': 'seo-meta-description',
            'setting_type_slug': 'meta-description',
            'category': 'seo',
            'order': 1,
        },
        {
            'source_field': 'meta_keywords',
            'setting_name': 'Meta Keywords',
            'setting_slug': 'seo-meta-keywords',
            'setting_type_slug': 'meta-keywords',
            'category': 'seo',
            'order': 2,
        },
    ]

    def add_arguments(self, parser):
        parser.add_argument(
            '--dry-run',
            action='store_true',
            help='Affiche les changements sans les appliquer',
        )
        parser.add_argument(
            '--force',
            action='store_true',
            help='Ecrase les settings existants avec les valeurs de SiteConfiguration',
        )

    def handle(self, *args, **options):
        dry_run = options.get('dry_run', False)
        force = options.get('force', False)

        # Verifier que SiteConfiguration existe
        try:
            from apps.core.models import SiteConfiguration
        except ImportError:
            self.stdout.write(self.style.ERROR(
                'Impossible d\'importer SiteConfiguration. Verifiez que apps.core est installe.'
            ))
            return

        # Recuperer la configuration existante
        try:
            config = SiteConfiguration.get_config()
        except Exception as e:
            self.stdout.write(self.style.ERROR(f'Erreur lors de la recuperation de SiteConfiguration: {e}'))
            return

        if dry_run:
            self.stdout.write(self.style.WARNING('\n=== MODE DRY-RUN (aucune modification) ===\n'))

        created_count = 0
        updated_count = 0
        skipped_count = 0
        errors = []

        for mapping in self.FIELD_MAPPING:
            source_field = mapping['source_field']
            setting_slug = mapping['setting_slug']
            setting_name = mapping['setting_name']
            setting_type_slug = mapping['setting_type_slug']
            category = mapping.get('category', 'general')
            order = mapping.get('order', 0)
            is_required = mapping.get('is_required', False)

            # Recuperer la valeur source
            value = getattr(config, source_field, None)
            if value is None or value == '':
                value = ''

            # Recuperer le type
            try:
                setting_type = SettingType.objects.get(slug=setting_type_slug)
            except SettingType.DoesNotExist:
                errors.append(f'Type "{setting_type_slug}" non trouve pour {setting_slug}')
                self.stdout.write(self.style.ERROR(
                    f'  ! Type "{setting_type_slug}" non trouve - Executez d\'abord seed_setting_types'
                ))
                continue

            # Verifier si le setting existe deja
            existing = Setting.objects.filter(slug=setting_slug).first()

            if existing and not force:
                skipped_count += 1
                self.stdout.write(self.style.NOTICE(
                    f'  - {setting_name}: existe deja (slug={setting_slug})'
                ))
                continue

            if dry_run:
                if existing:
                    self.stdout.write(self.style.WARNING(
                        f'  ~ {setting_name}: serait mis a jour\n'
                        f'      Ancienne valeur: "{existing.value}"\n'
                        f'      Nouvelle valeur: "{value}"'
                    ))
                    updated_count += 1
                else:
                    self.stdout.write(self.style.SUCCESS(
                        f'  + {setting_name}: serait cree\n'
                        f'      Valeur: "{value}"\n'
                        f'      Type: {setting_type.name}'
                    ))
                    created_count += 1
            else:
                # Creer ou mettre a jour le setting
                if existing:
                    existing.value = str(value) if value else ''
                    existing.type = setting_type
                    existing.category = category
                    existing.order = order
                    existing.is_required = is_required
                    existing.save()
                    updated_count += 1
                    self.stdout.write(self.style.WARNING(
                        f'  ~ {setting_name}: mis a jour avec "{value}"'
                    ))
                else:
                    Setting.objects.create(
                        name=setting_name,
                        slug=setting_slug,
                        value=str(value) if value else '',
                        type=setting_type,
                        category=category,
                        order=order,
                        is_required=is_required,
                        description=f'Migre depuis SiteConfiguration.{source_field}',
                    )
                    created_count += 1
                    self.stdout.write(self.style.SUCCESS(
                        f'  + {setting_name}: cree avec "{value}"'
                    ))

        # Resume
        self.stdout.write('')
        if dry_run:
            self.stdout.write(self.style.WARNING('=== FIN DU MODE DRY-RUN ==='))
            self.stdout.write(
                f'\nSi execute sans --dry-run:\n'
                f'  - {created_count} settings seraient crees\n'
                f'  - {updated_count} settings seraient mis a jour\n'
                f'  - {skipped_count} settings ignores (existent deja)'
            )
        else:
            self.stdout.write(self.style.SUCCESS(
                f'\nMigration terminee:\n'
                f'  - {created_count} settings crees\n'
                f'  - {updated_count} settings mis a jour\n'
                f'  - {skipped_count} settings ignores'
            ))

        if errors:
            self.stdout.write(self.style.ERROR(f'\nErreurs ({len(errors)}):'))
            for error in errors:
                self.stdout.write(self.style.ERROR(f'  - {error}'))
            self.stdout.write(self.style.WARNING(
                '\nExecutez "python manage.py seed_setting_types" pour creer les types manquants.'
            ))
