from django.core.management.base import BaseCommand
from django.db import transaction

from app_files.models import models_sales_documents, models_sales_document_lines


class Command(BaseCommand):
    help = "Liste ou supprime les lignes dynamiques au-delà de 25, créées pendant les tests D6. Dry-run par défaut."

    def add_arguments(self, parser):
        parser.add_argument('--doc', type=str, default='', help='Limiter à un id_sales_documents précis.')
        parser.add_argument('--execute', action='store_true', help='Supprime réellement les lignes > 25.')
        parser.add_argument('--show-details', action='store_true', help='Affiche chaque ligne concernée.')

    def handle(self, *args, **options):
        doc_filter = (options.get('doc') or '').strip()
        execute = bool(options.get('execute'))
        show_details = bool(options.get('show_details'))

        self.stdout.write('Nettoyage lignes documents > 25')
        self.stdout.write('--------------------------------')

        docs_qs = models_sales_documents.objects.all().order_by('id_sales_documents')
        if doc_filter:
            docs_qs = docs_qs.filter(id_sales_documents=doc_filter)

        docs = list(docs_qs)
        if not docs:
            self.stdout.write('Aucun document trouvé pour ce filtre.')
            return

        total_lines_to_delete = 0
        docs_with_extra = []
        line_ids_to_delete = []

        for doc in docs:
            extra_lines = list(
                models_sales_document_lines.objects
                .filter(sales_document=doc, sales_documents_line_position__gt=25)
                .order_by('sales_documents_line_position', 'sales_documents_line_number', 'id_sales_document_line')
            )

            if not extra_lines:
                continue

            docs_with_extra.append(doc.id_sales_documents)
            total_lines_to_delete += len(extra_lines)
            line_ids_to_delete.extend([line.id_sales_document_line for line in extra_lines])

            self.stdout.write(f"- doc={doc.id_sales_documents} | lignes >25={len(extra_lines)}")

            if show_details:
                for line in extra_lines:
                    product_id = line.product_id or ''
                    self.stdout.write(
                        f"  line_id={line.id_sales_document_line} | "
                        f"number={line.sales_documents_line_number} | "
                        f"position={line.sales_documents_line_position} | "
                        f"product={product_id} | "
                        f"qty={line.sales_documents_quantity} | "
                        f"price={line.sales_documents_price}"
                    )

        self.stdout.write('')
        self.stdout.write('Résumé')
        self.stdout.write('------')
        self.stdout.write(f'Documents analysés : {len(docs)}')
        self.stdout.write(f'Documents avec lignes >25 : {len(docs_with_extra)}')
        self.stdout.write(f'Lignes >25 détectées : {total_lines_to_delete}')

        if total_lines_to_delete == 0:
            self.stdout.write('Résultat : aucune ligne >25 à nettoyer.')
            return

        if not execute:
            self.stdout.write('')
            self.stdout.write('DRY-RUN uniquement : aucune ligne supprimée.')
            self.stdout.write('Pour appliquer réellement :')
            if doc_filter:
                self.stdout.write(f'python manage.py clean_document_lines_over_25 --doc {doc_filter} --execute')
            else:
                self.stdout.write('python manage.py clean_document_lines_over_25 --execute')
            return

        with transaction.atomic():
            deleted_count, deleted_details = models_sales_document_lines.objects.filter(
                id_sales_document_line__in=line_ids_to_delete
            ).delete()

        self.stdout.write('')
        self.stdout.write(f'Suppression réelle effectuée : {deleted_count} objet(s) supprimé(s).')
        self.stdout.write('Relance ensuite :')
        self.stdout.write('python manage.py check_new_tables_integrity')
        self.stdout.write('python manage.py check_document_lines_consistency')
