"""Read-only artifact checks, then archive current document checkpoint."""
from pathlib import Path
from hashlib import sha256
from zipfile import ZipFile
from shutil import copy2
from collections import Counter
import json, re
from docx import Document
from pypdf import PdfReader
from PIL import Image

root = Path(r'C:\Users\Asus\Desktop\TourAppProject\travelin_app\docs\thesis_appendices')
state_path = root / 'work/agency_capture_batch.json'
state = json.loads(state_path.read_text(encoding='utf-8'))
word = root / 'TourApp_Appendix_A_B.docx'
pdf = root / 'TourApp_Appendix_A_B_Review.pdf'
doc = Document(word)
assert len(doc.inline_shapes) == 21
assert sum(p.style.name == 'Heading 2' for p in doc.paragraphs) == 54
assert sum('[รอภาพหน้าจอจริง:' in p.text for p in doc.paragraphs) == 29
captions = [p.text for p in doc.paragraphs if p.style.name == 'Caption' and p.text.startswith('ภาพประกอบที่ ')]
numbers = [re.match(r'ภาพประกอบที่ ([กข]-\d+)', p).group(1) for p in captions]
assert numbers == [f'ก-{n}' for n in range(1, 6)] + [f'ข-{n}' for n in range(1, 17)]
assert doc.core_properties.author == '' and doc.core_properties.last_modified_by == ''
with ZipFile(word) as z:
    assert z.testzip() is None
    media = [n for n in z.namelist() if n.startswith('word/media/')]
    media_hashes = {sha256(z.read(n)).hexdigest() for n in media}
    assert len(media) == len(media_hashes) == 20
    assert all(sha256(Path(p).read_bytes()).hexdigest() in media_hashes for p in state['outputs'].values())
    assert all(sha256(Path(p).read_bytes()).hexdigest() not in media_hashes for p in state['sources'].values())
assert all(sha256(Path(p).read_bytes()).hexdigest() == state['original_hashes'][k] for k, p in state['sources'].items())
pending = (root / 'appendix_pending.md').read_text(encoding='utf-8')
rows = re.findall(r'^\| (?:ก\.\d+|ข\.\d+\.\d+) [^|]+ \| ([BCD]) \|', pending, flags=re.M)
assert len(rows) == 29 and Counter(rows) == {'B': 2, 'C': 22, 'D': 5}
reader = PdfReader(pdf)
assert len(reader.pages) == 37
caption_pages = {}
for i, page in enumerate(reader.pages, 1):
    for number in re.findall(r'ภาพประกอบที่ (ข-\d+) ', page.extract_text()):
        if number in {'ข-11', 'ข-12', 'ข-13', 'ข-14', 'ข-15'}:
            caption_pages[number] = i
assert caption_pages == {'ข-11': 28, 'ข-12': 30, 'ข-13': 31, 'ข-14': 32, 'ข-15': 33}
old = root / 'work/profile_dashboard_final_render_20261003'
new = root / 'work/agency_capture_final_render_20261003'
old_hashes = {sha256(Image.open(p).tobytes()).hexdigest() for p in old.glob('page-*.png')}
assert len(list(new.glob('page-*.png'))) == 37
same, changed = [], []
for p in sorted(new.glob('page-*.png')):
    (same if sha256(Image.open(p).tobytes()).hexdigest() in old_hashes else changed).append(p.name)
assert len(same) == 26 and len(changed) == 11
cp = Path(state['checkpoint'])
for name in ('TourApp_Appendix_A_B.docx', 'TourApp_Appendix_A_B_Review.pdf', 'appendix_progress.md', 'appendix_pending.md', 'appendix_image_index.md', 'appendix_capture_guide.md'):
    copy2(root / name, cp / name)
state.update({
    'pdf_pages': 37, 'heading_2_topics': 54, 'caption_pages': caption_pages,
    'unique_media': len(media), 'pending_categories': dict(Counter(rows)),
    'word_sha256': sha256(word.read_bytes()).hexdigest(),
    'pdf_sha256': sha256(pdf.read_bytes()).hexdigest(),
    'source_hashes_unchanged': True, 'raw_sources_embedded': False,
    'render_engine': 'Word COM read-only export, Poppler 120 dpi',
    'visual_review_new_or_changed_pages': changed,
    'pixel_identical_previously_reviewed_pages': same,
    'visual_review_result': 'PASS: changed pages 27-37 visually inspected; no overlap/clipping or separated captions',
    'source_code_edits': 0, 'database_operations': 0, 'external_api_requests': 0,
    'remaining_agency_topics': ['ข.2.5', 'ข.2.6', 'ข.2.7', 'ข.2.9'],
})
state_path.write_text(json.dumps(state, ensure_ascii=False, indent=2), encoding='utf-8')
(cp / 'verification.json').write_text(json.dumps(state, ensure_ascii=False, indent=2), encoding='utf-8')
print(json.dumps({k: state[k] for k in ('checkpoint', 'embedded_images', 'unique_media', 'pdf_pages', 'pending_topics', 'pending_categories', 'caption_pages', 'source_hashes_unchanged', 'word_sha256', 'pdf_sha256')}, ensure_ascii=False))
