"""اصلاح یک‌باره‌ی داده‌های وارد‌شده از اکسل — دستور `flask fix-data` (پیش‌نمایش) و `flask fix-data --apply` (اعمال).

- شماره‌ها: ارقام انگلیسی، بدون فاصله، 0098/+98 -> 0، موبایل بدون صفر اول -> با صفر، «0» -> خالی.
- شماره‌های موبایل تکراری فقط گزارش می‌شن؛ ادغام دو مشتری تصمیم انسانیه.

نام‌ها عمداً دست نمی‌خورن: تقریباً همه‌ی مشتری‌هایی که نام کوچکشون «.» است، در نام خانوادگی «نوع مشتری + اسم»
دارن («مغازه دار ...»، «مشتری ...»، «پنل دستگاه ...»، «طلای ...»، «کیفی ...») نه نام و نام خانوادگی؛
تقسیم خودکار برای هزاران مشتری نام کوچکی مثل «مغازه» می‌ساخت.
"""
from collections import defaultdict

from sqlalchemy import or_

from app.extensions import db
from app.models.customer import Customer
from app.services.activity_logger import log_action
from app.services.customer_service import normalize_phone


def plan_phone_fixes():
    changes = []
    query = Customer.query.filter(or_(Customer.mobile_phone.isnot(None), Customer.landline_phone.isnot(None)))
    for customer in query.order_by(Customer.id):
        mobile = normalize_phone(customer.mobile_phone)
        landline = normalize_phone(customer.landline_phone)
        if mobile != customer.mobile_phone or landline != customer.landline_phone:
            changes.append((customer, mobile, landline))
    return changes


def duplicate_mobiles(planned_mobiles=None):
    """شماره موبایل‌هایی که (بعد از یکدست‌سازی) برای بیش از یک مشتری فعال ثبت شدن."""
    planned_mobiles = planned_mobiles or {}
    groups = defaultdict(list)
    for customer in Customer.query.filter(Customer.is_deleted.is_(False)).order_by(Customer.id):
        mobile = planned_mobiles.get(customer.id, customer.mobile_phone)
        if mobile:
            groups[mobile].append(customer)
    return {phone: customers for phone, customers in groups.items() if len(customers) > 1}


def run(apply_changes: bool, echo=print):
    phone_fixes = plan_phone_fixes()
    duplicates = duplicate_mobiles({c.id: mobile for c, mobile, _landline in phone_fixes})

    echo(f"شماره‌هایی که یکدست می‌شن: {len(phone_fixes)}")
    for customer, mobile, landline in phone_fixes[:10]:
        echo(f"  #{customer.id}: موبایل {customer.mobile_phone!r} -> {mobile!r} | ثابت {customer.landline_phone!r} -> {landline!r}")
    if len(phone_fixes) > 10:
        echo(f"  ... و {len(phone_fixes) - 10} مورد دیگه")

    echo(f"شماره موبایل‌های تکراری (فقط گزارش، تغییری داده نمی‌شه): {len(duplicates)}")
    for phone, customers in duplicates.items():
        names = "، ".join(f"#{c.id} {c.first_name} {c.last_name}".strip() for c in customers)
        echo(f"  {phone}: {names}")

    if not apply_changes:
        echo("این فقط پیش‌نمایش بود و چیزی تغییر نکرد. برای اعمال: flask fix-data --apply")
        return {"phones": len(phone_fixes), "duplicates": len(duplicates), "applied": False}

    for customer, mobile, landline in phone_fixes:
        customer.mobile_phone = mobile
        customer.landline_phone = landline
    db.session.commit()
    log_action(None, "update", "customer_data_fix", details={"phones": len(phone_fixes)})
    echo("✓ اصلاحات اعمال شد.")
    return {"phones": len(phone_fixes), "duplicates": len(duplicates), "applied": True}
