# -*- coding: utf-8 -*-
"""공주시 227~414행 재검수 적용.
규칙(226행 검수 캘리브레이션 결과):
 R1 관광지 dongList(tursmCn): L 페이지->게시판, M=썸네일수
 R2 게시판 글수 재계산: M=현재 크롤 글수 (board_count 있는 행, 값이 다를 때만)
 R3 찾아오시는길/오시는길: N=어문,이미지
DRY 기본. --write 시 백업 후 저장.
"""
import sys, json, shutil
import openpyxl

XLSX = r'D:\01.프로젝트\DB수집\작업파일\광역_사이트맵\충청남도\2.공주시\충청남도_공주시.xlsx'
EV = r'D:\01.프로젝트\DB수집\_스크립트\_evidence.json'
LO, HI = 227, 414


def main():
    write = '--write' in sys.argv
    ev = json.load(open(EV, encoding='utf-8'))
    wb = openpyxl.load_workbook(XLSX)
    ws = wb.active
    changes = []  # (row, col, colname, old, new, rule)
    drift = []    # 미세 드리프트(원본 유지) 보고용

    for r in range(LO, HI + 1):
        e = ev.get(str(r))
        if not e:
            continue
        url = (ws.cell(r, 11).value or '')
        L = ws.cell(r, 12).value
        M = ws.cell(r, 13).value
        N = ws.cell(r, 14).value
        Gname = ws.cell(r, 7).value or ''
        Fname = ws.cell(r, 6).value or ''
        name = '%s %s' % (Fname, Gname)

        # R1 관광지 dongList
        if 'tursmCn' in url and e.get('tursm_count'):
            tc = e['tursm_count']
            if L != '게시판':
                changes.append((r, 12, 'L', L, '게시판', 'R1관광지'))
            if M != tc:
                changes.append((r, 13, 'M', M, tc, 'R1관광지'))
            continue  # 관광지는 M 규칙2 적용 안함

        # R2 게시판 글수 재계산 (0/빈 값만 복구; 유효 비0값의 미세 드리프트는 원본 유지)
        if L == '게시판' and e.get('board_count') is not None:
            bc = e['board_count']
            if (M in (None, 0, '0')) and bc:
                changes.append((r, 13, 'M', M, bc, 'R2게시판글수복구'))
            elif M != bc:
                drift.append((r, M, bc, ws.cell(r, 7).value or ws.cell(r, 6).value or ''))

        # R3 찾아오시는길 N
        if ('찾아오시는' in name) or ('오시는길' in name) or ('오시는 길' in name):
            if N == '어문':
                changes.append((r, 14, 'N', N, '어문,이미지', 'R3오시는길'))

    # report
    print('=== 제안 변경 %d건 (DRY) ===' % len(changes))
    by = {}
    for r, c, cn, old, new, rule in changes:
        by.setdefault(rule, []).append((r, cn, old, new))
    for rule in sorted(by):
        print('\n[%s] %d건' % (rule, len(by[rule])))
        for r, cn, old, new in by[rule]:
            g = ws.cell(r, 7).value or ws.cell(r, 6).value or ws.cell(r, 5).value or ''
            print('  r%d %s: %r -> %r   (%s)' % (r, cn, old, new, g))

    if drift:
        print('\n[미세 드리프트: 원본 유지, 참고용] %d건' % len(drift))
        for r, old, new, g in drift:
            print('  r%d 게시판글수 원본 %s (현재 크롤 %s, 차이 %+d)  %s' % (r, old, new, new - (old or 0), g))

    if write:
        bak = XLSX.replace('.xlsx', '_backup_재검수227전.xlsx')
        shutil.copy(XLSX, bak)
        for r, c, cn, old, new, rule in changes:
            ws.cell(r, c).value = new
        wb.save(XLSX)
        print('\n저장 완료. 백업:', bak)
    else:
        print('\n(DRY — 적용하려면 --write)')


if __name__ == '__main__':
    main()
