"""Экспорт в CSV и Markdown (альтернативные форматы, аналог ветки ps1,
предлагающей CSV/Markdown, если Excel по каким-то причинам не создался,
и запускаемые теперь и просто по выбору пользователя в GUI)."""
from __future__ import annotations

import csv
from pathlib import Path
from typing import Sequence

from app.config import ErrorEntry, ScanStats, SearchResult


def export_to_csv(results: Sequence[SearchResult], file_path: str, errors: Sequence[ErrorEntry] | None = None) -> bool:
    try:
        path = Path(file_path)
        path.parent.mkdir(parents=True, exist_ok=True)
        with open(path, "w", newline="", encoding="utf-8-sig") as fh:
            writer = csv.writer(fh, delimiter=";")
            writer.writerow(["Имя файла", "Полный путь", "Тип", "Найденное слово", "Контекст", "Изменён"])
            for r in results:
                writer.writerow([r.file_name, r.full_path, r.file_type, r.word, r.context, r.modified])

        if errors:
            err_path = path.with_name(path.stem + "_errors.csv")
            with open(err_path, "w", newline="", encoding="utf-8-sig") as fh:
                writer = csv.writer(fh, delimiter=";")
                writer.writerow(["Время", "Уровень", "Файл", "Сообщение"])
                for e in errors:
                    writer.writerow([e.timestamp, e.level, e.file_path, e.message])
        return True
    except OSError:
        return False


def export_to_markdown(
    results: Sequence[SearchResult],
    search_info: dict,
    errors: Sequence[ErrorEntry],
    file_path: str,
) -> bool:
    try:
        lines = ["# Отчёт DSP Scanner", ""]
        lines.append(f"**Дата:** {search_info.get('generated_at', '')}  ")
        lines.append(f"**Пути поиска:** {', '.join(search_info.get('paths', []))}  ")
        lines.append(f"**Искомые слова:** {', '.join(search_info.get('words', []))}  ")
        lines.append(f"**Метод чтения DOC:** {search_info.get('doc_method', '')}  ")
        lines.append("")
        lines.append(f"Найдено совпадений: **{len(results)}**")
        lines.append("")

        by_file: dict[str, list[SearchResult]] = {}
        for r in results:
            by_file.setdefault(r.full_path, []).append(r)

        for full_path, items in by_file.items():
            lines.append(f"## {items[0].file_name}")
            lines.append(f"`{full_path}`")
            lines.append("")
            for item in items:
                highlighted = item.context.replace(item.word, f"**{item.word}**")
                lines.append(f"- **{item.word}**: {highlighted}")
            lines.append("")

        if errors:
            lines.append("## Ошибки")
            for e in errors:
                lines.append(f"- `{e.timestamp}` [{e.level}] {e.file_path}: {e.message}")

        path = Path(file_path)
        path.parent.mkdir(parents=True, exist_ok=True)
        path.write_text("\n".join(lines), encoding="utf-8")
        return True
    except OSError:
        return False
