from __future__ import annotations

import csv
import io
from typing import Any


def parse_csv_content(csv_content: str) -> dict[str, Any]:
    """
    Ultra-robust parsing matching Laravel CampaignController::parseCsvContent.
    """
    try:
        lines = [ln for ln in csv_content.split("\n") if ln.strip() != ""]
        lines = list(lines)
        if len(lines) < 2:
            return {
                "success": False,
                "error": "File must contain at least header and name and contact data row",
            }

        contacts: list[dict[str, str]] = []
        headers: list[str] = []
        name_column_index = -1
        contact_column_index = -1

        for index, line in enumerate(lines):
            line = line.strip()
            if not line:
                continue

            row: list[str] = []
            delimiters = [",", "\t", ";", "|"]
            for delimiter in delimiters:
                if delimiter == ",":
                    row = next(csv.reader(io.StringIO(line)))
                else:
                    row = line.split(delimiter)
                if len(row) >= 2:
                    break

            row = [str(field).strip(" \t\n\r\0\x0b\"'") for field in row]

            if index == 0:
                headers = row
                for i, header in enumerate(headers):
                    normalized = header.lower().strip()
                    if any(
                        x in normalized
                        for x in ("name", "fullname", "full_name", "customer_name")
                    ):
                        name_column_index = i
                    if any(
                        x in normalized
                        for x in (
                            "contact",
                            "phone",
                            "mobile",
                            "number",
                            "phone_number",
                            "mobile_number",
                        )
                    ):
                        contact_column_index = i
                continue

            if name_column_index >= 0 and contact_column_index >= 0:
                contact_data = {
                    "name": row[name_column_index] if name_column_index < len(row) else "",
                    "contact": row[contact_column_index] if contact_column_index < len(row) else "",
                }
                if contact_data["name"] or contact_data["contact"]:
                    contacts.append(contact_data)

        if name_column_index == -1 or contact_column_index == -1:
            return {
                "success": False,
                "error": "Could not find name and contact columns. Found: " + ", ".join(headers),
            }

        if not contacts:
            return {"success": False, "error": "No valid contact data found"}

        return {
            "success": True,
            "message": f"Successfully parsed {len(contacts)} contacts",
            "total_count": len(contacts),
            "contacts": contacts,
            "columns_found": headers,
        }
    except Exception as e:  # noqa: BLE001 - parity with Laravel
        return {"success": False, "error": f"Error parsing file: {e}"}
