#!/usr/bin/env python3
"""Проверить журнал и локальные оригиналы дела."""
import argparse
import csv
import hashlib
import sys
from pathlib import Path

parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("case", type=Path, help="папка, созданная osint-case new")
root = parser.parse_args().case.resolve()
errors = []
known = set()
count = 0
try:
    with (root / "evidence.csv").open(encoding="utf-8-sig", newline="") as stream:
        records = csv.DictReader(stream)
        required = {"source_id", "original_file", "sha256", "retrieved_at_utc"}
        if not required.issubset(records.fieldnames or []):
            sys.exit("В evidence.csv отсутствуют обязательные столбцы.")
        for line, record in enumerate(records, 2):
            count += 1
            sid = record["source_id"].strip()
            if not sid or sid in known:
                errors.append(f"Строка {line}: пропущен или повторён source_id")
            known.add(sid)
            if not record["retrieved_at_utc"].strip():
                errors.append(f"Строка {line}: заполните дату получения")
            path = (root / record["original_file"]).resolve()
            if not path.is_relative_to(root) or not path.is_file():
                errors.append(f"Строка {line}: оригинал отсутствует внутри дела")
                continue
            with path.open("rb") as original:
                actual = hashlib.file_digest(original, "sha256").hexdigest()
            if actual != record["sha256"].strip().lower():
                errors.append(f"Строка {line}: контрольная сумма отличается или отсутствует")
    with (root / "edges.csv").open(encoding="utf-8-sig", newline="") as stream:
        for line, edge in enumerate(csv.DictReader(stream), 2):
            if not edge.get("source_id") or edge["source_id"] not in known:
                errors.append(f"edges.csv, строка {line}: источник связи отсутствует в журнале")
except (OSError, csv.Error, UnicodeError) as error:
    sys.exit(str(error))
if not count:
    errors.append("Журнал пуст.")
print(f"Записей: {count}. Замечаний: {len(errors)}.")
for error in errors:
    print(error)
sys.exit(bool(errors))
