#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
优卖云周报数据自动导出脚本 (跨平台版)
支持 Windows / macOS / Linux
用法:
    python sellerspace_auto_export.py --interactive
    python sellerspace_auto_export.py --start-date 2026-05-03 --end-date 2026-05-09
"""

import os
import sys
import time
import argparse
import subprocess
from datetime import datetime, timedelta
from pathlib import Path

# 检查playwright是否安装
try:
    from playwright.sync_api import sync_playwright
except ImportError:
    print("错误: 未安装 Playwright。")
    print("请运行: python install_env.py")
    sys.exit(1)

BASE_URL = "https://www.sellerspace.com/"
DEFAULT_DOWNLOAD_DIR = Path.home() / "Desktop" / "erp文档" / "周报"


def parse_date(date_str):
    """解析日期字符串 YYYY-MM-DD"""
    return datetime.strptime(date_str, "%Y-%m-%d")


def get_platform_name():
    """获取当前平台名称"""
    if sys.platform == "win32":
        return "Windows"
    elif sys.platform == "darwin":
        return "macOS"
    else:
        return "Linux"


def print_progress(step, total, msg):
    """打印进度信息"""
    pct = int(step / total * 100)
    bar = "█" * (pct // 5) + "░" * (20 - pct // 5)
    print(f"\r[{bar}] {pct}% | {msg}", end="", flush=True)
    if step >= total:
        print()


def launch_browser(p, download_dir):
    """启动浏览器 - 跨平台适配"""
    browser = None
    browser_name = ""

    # 优先尝试 Chrome/Edge，最后尝试默认 chromium
    channels = [
        ("msedge", "Edge"),
        ("chrome", "Chrome"),
        ("chromium", "Chromium"),
    ]

    for channel, name in channels:
        try:
            browser = p.chromium.launch(
                channel=channel if channel != "chromium" else None,
                headless=False,
                downloads_path=str(download_dir)
            )
            browser_name = name
            print(f"[OK] {name} 浏览器启动成功")
            break
        except Exception as e:
            print(f"[{name}] 启动失败: {e}")
            continue

    if browser is None:
        raise Exception("无法启动浏览器，请确保已安装 Chrome / Edge / Chromium\n"
                        "Windows: 通常已预装 Edge\n"
                        "macOS: 请安装 Chrome 或 Edge\n"
                        "Linux: 请安装 Chromium")

    return browser, browser_name


def login(page, username, password):
    """登录优卖云"""
    print_progress(1, 6, "正在打开优卖云...")
    page.goto(BASE_URL, timeout=60000, wait_until="domcontentloaded")
    time.sleep(3)

    # 点击登录按钮
    try:
        page.click("text=登录", timeout=5000)
        time.sleep(2)
    except:
        pass

    # 切换到账号登录
    try:
        page.click("text=账号登录", timeout=5000)
        time.sleep(1)
    except:
        pass

    print_progress(2, 6, "正在填写账号...")
    try:
        page.fill("input[placeholder='请输入邮箱']", username, timeout=5000)
    except:
        page.fill("input[type='text']", username, timeout=5000)
    time.sleep(0.5)

    print_progress(3, 6, "正在填写密码...")
    try:
        page.fill("input[placeholder='请输入密码']", password, timeout=5000)
    except:
        page.fill("input[type='password']", password, timeout=5000)
    time.sleep(0.5)

    print_progress(4, 6, "正在登录...")
    page.click("button:has-text('登录')")
    try:
        page.wait_for_url("**/home", timeout=30000)
    except:
        time.sleep(5)

    print_progress(5, 6, "登录成功！")
    time.sleep(3)


def set_date_range(page, start_date, end_date):
    """设置日期范围"""
    print(f"设置日期范围: {start_date} ~ {end_date}")
    page.evaluate("window.scrollTo(0, 0)")
    time.sleep(1)

    page.click(".ant-picker-range", force=True)
    time.sleep(1)

    page.keyboard.press("Control+a")
    page.keyboard.press("Delete")
    time.sleep(0.5)
    page.keyboard.type(f"{start_date} ~ {end_date}")
    time.sleep(0.5)
    page.keyboard.press("Enter")
    time.sleep(2)


def select_stores(page, stores):
    """选择店铺（如果提供）"""
    if not stores:
        print("未指定店铺，导出全部")
        return

    print(f"选择店铺: {', '.join(stores)}")
    try:
        page.click("text=所有站点, [placeholder*='店铺'], [placeholder*='站点']", timeout=3000)
        time.sleep(1)
        page.click("text=全选", timeout=3000)
        time.sleep(0.5)

        for store in stores:
            try:
                page.click(f"text={store}", timeout=3000)
                print(f"  已选择: {store}")
                time.sleep(0.3)
            except:
                print(f"  未找到店铺: {store}")

        page.click("text=确定", timeout=3000)
        time.sleep(1)
    except Exception as e:
        print(f"店铺选择失败（可能页面结构不同）: {e}")


def export_report(page, report_name, report_url_text, download_dir, start_date, end_date, stores):
    """导出单个报表"""
    print("=" * 50)
    print(f"开始导出: {report_name}")
    print("=" * 50)

    page.click("text=经营分析")
    time.sleep(2)
    page.click(f"text={report_url_text}")
    time.sleep(4)

    set_date_range(page, start_date, end_date)
    select_stores(page, stores)

    page.click("button:has-text('查询'), button:has-text('搜索')", force=True)
    time.sleep(4)

    print("点击导出按钮...")
    with page.expect_download(timeout=120000) as download_info:
        page.click("button:has-text('导出'), .export-btn, [class*='export']", force=True)

    download = download_info.value
    original_filename = download.suggested_filename
    report_path = download_dir / original_filename
    download.save_as(str(report_path))
    print(f"报表已保存: {report_path}")
    return report_path


def run(start_date, end_date, stores, download_dir, username, password):
    """主流程"""
    download_dir = Path(download_dir)
    download_dir.mkdir(parents=True, exist_ok=True)

    print(f"\n[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 开始导出优卖云周报数据")
    print(f"平台: {get_platform_name()}")
    print(f"日期范围: {start_date} ~ {end_date}")
    print(f"下载目录: {download_dir}")
    print()

    with sync_playwright() as p:
        browser, browser_name = launch_browser(p, download_dir)
        context = browser.new_context(
            accept_downloads=True,
            viewport={"width": 1920, "height": 1080}
        )
        page = context.new_page()

        try:
            login(page, username, password)

            sales_path = export_report(
                page, "商品分析（销量）", "商品分析",
                download_dir, start_date, end_date, stores
            )

            profit_path = export_report(
                page, "利润统计", "利润统计",
                download_dir, start_date, end_date, stores
            )

            print("\n" + "=" * 50)
            print("导出完成！")
            print("=" * 50)
            print(f"销量报表: {sales_path}")
            print(f"利润报表: {profit_path}")
            print(f"\n请将这两个文件拖拽到周报工具中进行分析。")

        except Exception as e:
            print(f"\n导出过程中出错: {e}")
            import traceback
            traceback.print_exc()
        finally:
            print("\n浏览器将在 10 秒后关闭...")
            time.sleep(10)
            browser.close()


def main():
    parser = argparse.ArgumentParser(description="优卖云周报数据自动导出")
    parser.add_argument("--start-date", help="开始日期 YYYY-MM-DD")
    parser.add_argument("--end-date", help="结束日期 YYYY-MM-DD")
    parser.add_argument("--stores", nargs="+", default=[], help="店铺名称列表（可选）")
    parser.add_argument("--download-dir", default=str(DEFAULT_DOWNLOAD_DIR), help="下载目录")
    parser.add_argument("--username", help="优卖云账号邮箱")
    parser.add_argument("--password", help="优卖云密码")
    parser.add_argument("--interactive", action="store_true", help="交互式输入")

    args = parser.parse_args()

    if args.interactive or not args.start_date or not args.end_date:
        print("=== 优卖云周报数据自动导出 ===")
        print(f"当前平台: {get_platform_name()}")
        print()

        start = input("请输入开始日期 (YYYY-MM-DD): ").strip()
        end = input("请输入结束日期 (YYYY-MM-DD): ").strip()
        stores_input = input("请输入店铺名称（多个用空格分隔，留空表示全部）: ").strip()
        stores = stores_input.split() if stores_input else []

        username = input("优卖云账号邮箱: ").strip()
        password = input("优卖云密码: ").strip()

        args.start_date = start
        args.end_date = end
        args.stores = stores
        args.username = username
        args.password = password
    else:
        if not args.username or not args.password:
            print("错误: 非交互模式需要提供 --username 和 --password")
            sys.exit(1)

    run(args.start_date, args.end_date, args.stores, args.download_dir, args.username, args.password)


if __name__ == "__main__":
    main()
