#!/usr/bin/env python3
"""Monitor SemiAnalysis newsletter for new posts."""
import json, os, hashlib
from datetime import datetime
import feedparser, requests

DIR = os.path.dirname(os.path.abspath(__file__))
CFG = json.load(open(os.path.join(DIR, 'config.json')))
BOT = f"https://api.telegram.org/bot{CFG['telegram_bot_token']}"
SEEN_FILE = os.path.join(DIR, 'seen_semianalysis.json')
FEED_URL = 'https://newsletter.semianalysis.com/feed'


def load_seen():
    if os.path.exists(SEEN_FILE):
        return json.load(open(SEEN_FILE))
    return []


def save_seen(seen):
    with open(SEEN_FILE, 'w') as f:
        json.dump(seen, f)


def shorten_url(url):
    for _ in range(3):
        try:
            r = requests.post('https://buly.kr/lib/control.siso',
                data={'CODE': '', 'dbControl': 'setTargetLinkToShotLink', 'v': url},
                headers={'Referer': 'https://buly.kr/', 'User-Agent': 'Mozilla/5.0'},
                timeout=10)
            data = r.json()
            if data.get('result') == 'Y' and data.get('key'):
                return f"https://buly.kr/{data['key']}"
        except Exception:
            pass
    return url


def main():
    print(f"[{datetime.now()}] Checking SemiAnalysis...")

    chat_id = CFG.get('chat_id')
    if not chat_id:
        print("ERROR: No chat_id.")
        return

    feed = feedparser.parse(FEED_URL)
    posts = []
    for entry in feed.entries[:10]:
        h = hashlib.md5(entry.get('link', '').encode()).hexdigest()
        posts.append({
            'title': entry.get('title', ''),
            'desc': entry.get('description', ''),
            'link': entry.get('link', ''),
            'hash': h,
        })

    seen = load_seen()

    if not seen:
        save_seen([p['hash'] for p in posts])
        print(f"  First run - saved {len(posts)} existing posts. No alerts sent.")
        return

    new_posts = [p for p in posts if p['hash'] not in seen]

    if not new_posts:
        print("  No new posts.")
        return

    print(f"  {len(new_posts)} new post(s) found!")

    for p in new_posts:
        short = shorten_url(p['link'])
        msg = f"<b>SemiAnalysis 새 글</b>\n\n{p['title']}\n{p['desc']}\n\n{short}"
        r = requests.post(f"{BOT}/sendMessage", json={
            'chat_id': chat_id,
            'text': msg,
            'parse_mode': 'HTML',
            'disable_web_page_preview': True
        }, timeout=15)
        if r.json().get('ok'):
            print(f"  Sent: {p['title']}")
        else:
            print(f"  Failed: {r.json()}")

    save_seen([p['hash'] for p in posts])
    print("  Done!")


if __name__ == '__main__':
    main()
