from __future__ import annotations

import json
import os
import zipfile
from pathlib import Path

from openpyxl import load_workbook
from pypdf import PdfReader


ROOT = Path(__file__).resolve().parents[1]
XLSX = ROOT / "source-docs" / "周报0605.xlsx"
PDF = ROOT / "source-docs" / "纪要_产品标准化与AI赋能周会纪要.pdf"
OUT = ROOT / "extracted" / "source-inspection.json"


def inspect_xlsx() -> dict:
    workbook = load_workbook(XLSX, read_only=True, data_only=True)
    sheets: list[dict] = []
    for sheet in workbook.worksheets:
        non_empty = 0
        text_cells = 0
        samples: list[str] = []
        for row in sheet.iter_rows():
            for cell in row:
                value = cell.value
                if value is None:
                    continue
                non_empty += 1
                if isinstance(value, str):
                    stripped = " ".join(value.split())
                    if stripped:
                        text_cells += 1
                        if len(samples) < 30:
                            samples.append(stripped[:240])
        sheets.append(
            {
                "title": sheet.title,
                "max_row": sheet.max_row,
                "max_column": sheet.max_column,
                "non_empty_cells": non_empty,
                "text_cells": text_cells,
                "samples": samples,
            }
        )
    workbook.close()

    media = []
    drawing_parts = []
    with zipfile.ZipFile(XLSX) as zf:
        for name in zf.namelist():
            if name.startswith("xl/media/"):
                info = zf.getinfo(name)
                media.append({"name": name, "size": info.file_size})
            elif name.startswith("xl/drawings/"):
                drawing_parts.append(name)
    return {
        "path": str(XLSX),
        "size": XLSX.stat().st_size,
        "sheets": sheets,
        "media_count": len(media),
        "media": media,
        "drawing_parts": drawing_parts,
    }


def inspect_pdf() -> dict:
    reader = PdfReader(str(PDF))
    pages = []
    for idx, page in enumerate(reader.pages, start=1):
        text = page.extract_text() or ""
        pages.append(
            {
                "page": idx,
                "text_chars": len(text),
                "sample": " ".join(text.split())[:1200],
            }
        )
    return {
        "path": str(PDF),
        "size": PDF.stat().st_size,
        "page_count": len(reader.pages),
        "pages": pages,
    }


def main() -> None:
    OUT.parent.mkdir(parents=True, exist_ok=True)
    report = {"xlsx": inspect_xlsx(), "pdf": inspect_pdf()}
    OUT.write_text(json.dumps(report, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(report, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()
