"""وارد کردن گروهی مشتری از فایل اکسل، با گزارش دقیق و پیشرفت زنده (اجرا در ترد پس‌زمینه)."""
import io
import threading

from app.extensions import db

TEMPLATE_HEADERS = [
    "نام", "نام خانوادگی", "شهر", "تلفن ثابت", "شماره موبایل", "جنسیت (آقا/خانم)",
    "تاریخ تولد (شمسی، مثال 1370/06/15)", "کد مشتری", "معرف", "نحوه آشنایی",
    "اینستاگرام", "وضعیت (جدید/فعال/غیرفعال/خواب)", "آدرس", "توضیحات",
]

GENDER_MAP = {"آقا": "male", "خانم": "female"}
STATUS_MAP = {"جدید": "new", "فعال": "active", "غیرفعال": "inactive", "خواب": "sleeping"}


def build_template_excel() -> io.BytesIO:
    from openpyxl import Workbook
    from openpyxl.styles import Font, Alignment, PatternFill

    wb = Workbook()
    ws = wb.active
    ws.title = "قالب مشتریان"
    ws.sheet_view.rightToLeft = True
    ws.append(TEMPLATE_HEADERS)
    header_fill = PatternFill(start_color="D4AF37", end_color="D4AF37", fill_type="solid")
    for cell in ws[1]:
        cell.font = Font(bold=True)
        cell.fill = header_fill
        cell.alignment = Alignment(horizontal="center")
    ws.append(["مریم", "کریمی", "تهران", "", "09121234567", "خانم", "1372/03/10", "", "", "اینستاگرام", "جدید", "", ""])
    for col in ws.columns:
        ws.column_dimensions[col[0].column_letter].width = 22

    buffer = io.BytesIO()
    wb.save(buffer)
    buffer.seek(0)
    return buffer


def _cell(row, idx):
    v = row[idx].value if idx < len(row) else None
    if v is None:
        return ""
    return str(v).strip()


def start_import_job(file_bytes: bytes, user_id: int) -> int:
    """جاب رو می‌سازه و پردازش رو در ترد پس‌زمینه شروع می‌کنه. شناسه جاب رو برمی‌گردونه."""
    from app.models.import_job import ImportJob
    from flask import current_app

    job = ImportJob(user_id=user_id, status="running")
    db.session.add(job)
    db.session.commit()
    job_id = job.id

    app_obj = current_app._get_current_object()
    thread = threading.Thread(target=_process_import, args=(app_obj, job_id, file_bytes, user_id), daemon=True)
    thread.start()
    return job_id


def _process_import(app, job_id, file_bytes, user_id):
    with app.app_context():
        from app.models.import_job import ImportJob
        from app.models.customer import Customer
        from app.services.jalali import jalali_str_to_gregorian_date
        from app.services.customer_service import next_customer_code
        from app.services.activity_logger import log_action
        from app.models.user import User

        job = db.session.get(ImportJob, job_id)
        try:
            from openpyxl import load_workbook
            wb = load_workbook(io.BytesIO(file_bytes), read_only=True, data_only=True)
            ws = wb.active
            rows = list(ws.iter_rows(min_row=2))
        except Exception as exc:
            job.status = "error"
            job.error_message = f"خواندن فایل اکسل ممکن نشد: {exc}"
            db.session.commit()
            return

        job.total_rows = len(rows)
        db.session.commit()

        notes = []  # {"row": i, "reason": "...", "type": "skipped"|"warning"}
        created = 0
        user = db.session.get(User, user_id)

        for i, row in enumerate(rows, start=2):
            first_name = _cell(row, 0)
            last_name = _cell(row, 1)
            if not first_name or not last_name:
                notes.append({"row": i, "reason": "نام یا نام خانوادگی خالی است — این ردیف رد شد", "type": "skipped"})
            else:
                city = _cell(row, 2) or None
                landline = _cell(row, 3) or None
                mobile = _cell(row, 4) or None
                gender = GENDER_MAP.get(_cell(row, 5), None)
                birth_date = None
                birth_raw = _cell(row, 6)
                if birth_raw:
                    try:
                        birth_date = jalali_str_to_gregorian_date(birth_raw)
                    except Exception:
                        notes.append({"row": i, "reason": f"تاریخ تولد «{birth_raw}» قابل تشخیص نبود — بدون تاریخ تولد ثبت شد", "type": "warning"})
                customer_code = _cell(row, 7) or None
                if customer_code and Customer.query.filter_by(customer_code=customer_code).first():
                    notes.append({"row": i, "reason": f"کد مشتری «{customer_code}» تکراری بود — کد جدید ساخته شد", "type": "warning"})
                    customer_code = next_customer_code()
                referrer_text = _cell(row, 8) or None
                how_found = _cell(row, 9) or None
                instagram_id = _cell(row, 10) or None
                status = STATUS_MAP.get(_cell(row, 11), "new")
                address = _cell(row, 12) or None
                description = _cell(row, 13) or None

                customer = Customer(
                    first_name=first_name, last_name=last_name, city=city,
                    landline_phone=landline, mobile_phone=mobile, gender=gender,
                    birth_date=birth_date, customer_code=customer_code, referrer_text=referrer_text,
                    how_found=how_found, instagram_id=instagram_id, status=status,
                    address=address, description=description, created_by=user_id,
                )
                db.session.add(customer)
                created += 1

            job.processed_rows = i - 1
            job.created_count = created
            job.skipped_count = sum(1 for n in notes if n["type"] == "skipped")
            db.session.commit()

        job.status = "done"
        job.errors = notes
        db.session.commit()
        log_action(user, "create", "customer_import", job_id,
                   {"created": created, "skipped": len(errors), "total": len(rows)})
