"""Build insta_mapping.json from insta_meta.json.

Input: insta_meta.json — list of {thread_id, thread_name (YYYY/MM/DD),
created_at_ts, caption, image_urls[]}.

Output: insta_mapping.json — keyed by week (YYMMDD_YYMMDD), then by day
(MON-FRI), with lunch/dinner arrays of {thread_id, caption, image_urls}.

Lunch/dinner heuristic:
- Group threads by date.
- Sort each date's threads by created_at_ts (ascending).
- First = lunch, second = dinner. Extras (3+) → all lumped into a 'extra'
  bucket and logged.
"""
import json
import sys
from collections import defaultdict
from datetime import datetime, timedelta
from pathlib import Path

if hasattr(sys.stdout, 'reconfigure'):
    sys.stdout.reconfigure(encoding='utf-8')

HERE = Path(__file__).resolve().parent
META = HERE / 'insta_meta.json'
OUT = HERE / 'insta_mapping.json'

DAY_NAMES = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']


def date_to_week(date_str: str) -> tuple[str, str] | None:
    """'2026/04/22' → ('260420_260424', 'WED'). Returns None if Sat/Sun."""
    d = datetime.strptime(date_str, '%Y/%m/%d').date()
    weekday = d.weekday()  # Mon=0..Sun=6
    if weekday >= 5:
        return None  # Skip weekend menus (kitchen closed)
    monday = d - timedelta(days=weekday)
    friday = monday + timedelta(days=4)
    week_key = f'{monday.strftime("%y%m%d")}_{friday.strftime("%y%m%d")}'
    day_name = DAY_NAMES[weekday]
    return week_key, day_name


def main():
    if not META.is_file():
        print(f'not found: {META}', file=sys.stderr)
        sys.exit(1)
    data = json.loads(META.read_text(encoding='utf-8'))
    print(f'loaded {len(data)} entries from {META.name}')

    # Dedupe: Playwright entries (thread_id starts with "insta_") and Discord-forum
    # entries (numeric thread_id) can describe the same Instagram post on the same
    # date. Discord entries are DeepL-translated reuploads by insta_bot; dropping
    # them when the Playwright original exists keeps lunch/dinner assignment correct.
    pw_dates = {e['thread_name'] for e in data
                if str(e.get('thread_id', '')).startswith('insta_')}
    before = len(data)
    data = [e for e in data
            if not (not str(e.get('thread_id', '')).startswith('insta_')
                    and e.get('thread_name') in pw_dates)]
    dropped = before - len(data)
    if dropped:
        print(f'dedupe: dropped {dropped} Discord entries that duplicate Playwright originals')

    by_date = defaultdict(list)
    for e in data:
        by_date[e['thread_name']].append(e)

    # Build week → day → meal → list
    mapping: dict = {}
    weekend_skipped = []
    extras_log = []

    for date_str, entries in sorted(by_date.items()):
        wk_day = date_to_week(date_str)
        if not wk_day:
            weekend_skipped.append(date_str)
            continue
        week_key, day_name = wk_day
        # Sort by created_at_ts ascending (lunch first)
        entries.sort(key=lambda x: x['created_at_ts'])

        if week_key not in mapping:
            mapping[week_key] = {}
        if day_name not in mapping[week_key]:
            mapping[week_key][day_name] = {'lunch': [], 'dinner': [], 'extra': []}

        slots = ['lunch', 'dinner']
        for i, e in enumerate(entries):
            slot = slots[i] if i < 2 else 'extra'
            if slot == 'extra':
                extras_log.append((date_str, i + 1))
            mapping[week_key][day_name][slot].append({
                'thread_id': e['thread_id'],
                'caption': e['caption'],
                'image_urls': e['image_urls'],
                'video_urls': e.get('video_urls') or [],
                'posted_at': e['created_at_kst'],
            })

    OUT.write_text(json.dumps(mapping, ensure_ascii=False, indent=2), encoding='utf-8')

    print(f'\n=== summary ===')
    print(f'  weeks covered: {len(mapping)}')
    print(f'  weekend dates skipped: {len(weekend_skipped)}', weekend_skipped[:5])
    print(f'  extras (3+ on same day): {len(extras_log)}', extras_log[:5])
    print(f'  output: {OUT}')

    # Per-week stats
    print('\n=== per-week ===')
    for wk in sorted(mapping):
        day_stats = []
        for d in DAY_NAMES[:5]:
            slots = mapping[wk].get(d, {})
            l = len(slots.get('lunch') or [])
            di = len(slots.get('dinner') or [])
            day_stats.append(f'{d}:{l}/{di}')
        print(f'  {wk}  {" ".join(day_stats)}')


if __name__ == '__main__':
    main()
