"""
茶当网 - 每日自动签到脚本（最终版）
策略：Playwright 登录 → 拿 Cookie → Python requests 直调 API
"""
from playwright.sync_api import sync_playwright, TimeoutError as PlaywrightTimeout
import requests, sys, os, json
from datetime import datetime

EMAIL = "littlehorse2315@hotmail.com"
PASSWORD = "chadangwang.com"
HEADLESS = "--headless" in sys.argv
WORKDIR = os.path.dirname(os.path.abspath(__file__))
LOG_FILE = os.path.join(WORKDIR, "chadang_checkin_log.txt")

def log(msg):
    ts = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    line = f"[{ts}] {msg}"
    print(line)
    with open(LOG_FILE, "a", encoding="utf-8") as f:
        f.write(line + "\n")

def login_and_get_cookies():
    """用 Playwright 登录，返回 requests 可用的 cookies dict 和 headers"""
    with sync_playwright() as p:
        browser = p.chromium.launch(
            headless=HEADLESS,
            args=["--disable-blink-features=AutomationControlled", "--no-sandbox"]
        )
        context = browser.new_context(
            viewport={"width": 1280, "height": 800},
            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
        )
        page = context.new_page()
        
        try:
            # 登录
            log("登录中...")
            page.goto("https://www.chadangwang.com/login", timeout=20000)
            page.wait_for_timeout(2000)
            
            # 关闭可能的弹窗
            for sel in ["#laterDownloadBtn", ".app-download-close"]:
                try:
                    el = page.query_selector(sel)
                    if el and el.is_visible():
                        el.click()
                        page.wait_for_timeout(300)
                except:
                    pass
            
            page.fill("#username", EMAIL)
            page.fill("#password", PASSWORD)
            page.click("button[type='submit']")
            page.wait_for_timeout(4000)
            
            # 验证登录
            page.goto("https://www.chadangwang.com/index.php?page=home", timeout=15000)
            page.wait_for_timeout(2000)
            
            # 检查是否登录成功（找用户积分元素）
            points_el = page.query_selector("#userPoints")
            if points_el:
                points = points_el.inner_text()
                log(f"登录成功！当前积分: {points}")
            else:
                log("WARN: 未找到积分元素，可能登录失败")
            
            # 提取 cookies
            cookies = context.cookies()
            browser.close()
            
            cookie_dict = {}
            for c in cookies:
                cookie_dict[c["name"]] = c["value"]
            
            headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
                "Content-Type": "application/json",
                "Referer": "https://www.chadangwang.com/index.php?page=home",
                "Origin": "https://www.chadangwang.com",
            }
            
            return cookie_dict, headers
            
        except Exception as e:
            log(f"ERROR 登录阶段: {e}")
            try:
                page.screenshot(path=os.path.join(WORKDIR, "chadang_login_error.png"))
            except:
                pass
            browser.close()
            return None, None

def check_checkin_status(cookies, headers):
    """GET /api/daily_checkin.php 查看签到状态"""
    try:
        resp = requests.get(
            "https://www.chadangwang.com/api/daily_checkin.php",
            cookies=cookies,
            headers=headers,
            timeout=15
        )
        resp.encoding = 'utf-8-sig'
        # Manually decode to handle BOM properly
        raw = resp.content.decode('utf-8-sig')
        data = json.loads(raw)
        log(f"签到状态: {json.dumps(data, ensure_ascii=False)}")
        return data
    except Exception as e:
        log(f"ERROR 获取签到状态: {e}")
        return None

def do_checkin(cookies, headers):
    """POST /api/daily_checkin.php 执行签到"""
    try:
        payload = {"action": "checkin"}
        resp = requests.post(
            "https://www.chadangwang.com/api/daily_checkin.php",
            json=payload,
            cookies=cookies,
            headers=headers,
            timeout=15
        )
        raw = resp.content.decode('utf-8-sig')
        data = json.loads(raw)
        log(f"签到结果: {json.dumps(data, ensure_ascii=False)}")
        return data
    except Exception as e:
        log(f"ERROR 签到请求: {e}")
        return None

def main():
    log("===== 茶当网每日签到 =====")
    
    # Step 1: 登录获取 Cookie
    cookies, headers = login_and_get_cookies()
    if not cookies:
        log("FATAL: 登录失败，退出")
        return
    
    # Step 2: 查询签到状态
    status = check_checkin_status(cookies, headers)
    if status and status.get("success"):
        if status.get("hasCheckedIn"):
            log("今天已经签到过了，无需重复签到")
            log(f"连续签到: {status.get('consecutiveDays', '?')} 天")
            log(f"当前积分: {status.get('points', '?')}")
            return
        else:
            log("今天尚未签到，准备签到...")
    
    # Step 3: 执行签到
    result = do_checkin(cookies, headers)
    if result and result.get("success"):
        log(f"[OK] 签到成功！信息: {result.get('message', '')}")
        if "points" in result:
            log(f"当前积分: {result['points']}")
        if "consecutiveDays" in result:
            log(f"连续签到: {result['consecutiveDays']} 天")
    else:
        msg = result.get("message", "未知错误") if result else "无响应"
        log(f"[FAIL] 签到失败: {msg}")
    
    log("===== 签到流程结束 =====")

if __name__ == "__main__":
    main()
