import csv
import io

from simorgh.apps.hr_core.services.encryption import decrypt_field


def export_employees_csv(
    tenant_id: int,
    *,
    include_sensitive: bool = False,
    status_filter: list[str] | None = None,
) -> bytes:
    from simorgh.apps.hr_core.models import Employee

    qs = (
        Employee.objects.filter(tenant_id=tenant_id, is_deleted=False)
        .select_related("job_title", "department", "manager")
        .order_by("last_name", "first_name")
    )
    if status_filter:
        qs = qs.filter(status__in=status_filter)

    fields = [
        "employee_no", "first_name", "last_name", "display_name",
        "work_email", "mobile", "gender", "birth_date", "hire_date",
        "employment_type", "status", "department", "job_title",
        "manager", "work_location", "termination_date",
    ]
    if include_sensitive:
        fields.append("national_id")

    buf = io.StringIO()
    writer = csv.DictWriter(buf, fieldnames=fields, extrasaction="ignore")
    writer.writeheader()

    for emp in qs:
        row: dict = {
            "employee_no": emp.employee_no,
            "first_name": emp.first_name,
            "last_name": emp.last_name,
            "display_name": emp.display_name,
            "work_email": emp.work_email,
            "mobile": emp.mobile,
            "gender": emp.gender,
            "birth_date": emp.birth_date.isoformat() if emp.birth_date else "",
            "hire_date": emp.hire_date.isoformat(),
            "employment_type": emp.employment_type,
            "status": emp.status,
            "department": emp.department.name if emp.department else "",
            "job_title": emp.job_title.title if emp.job_title else "",
            "manager": emp.manager.display_name if emp.manager else "",
            "work_location": emp.work_location,
            "termination_date": emp.termination_date.isoformat() if emp.termination_date else "",
        }
        if include_sensitive:
            row["national_id"] = decrypt_field(emp.national_id) if emp.national_id else ""
        writer.writerow(row)

    return buf.getvalue().encode("utf-8-sig")
