#!/usr/bin/env python3
"""
WordPress 文章发布脚本 (XML-RPC)
发布到 https://dianziqianzhang.com

用法:
  python3 publish-wordpress.py <markdown_file> [--status draft|publish] [--categories 1,2,3] [--tags tag1,tag2]

参数:
  markdown_file  - 要发布的 Markdown 文件路径
  --status       - 发布状态: draft(草稿) / publish(发布), 默认 draft
  --categories   - 分类 ID 列表, 逗号分隔
  --tags         - 标签名列表, 逗号分隔
  --password     - 文章密码（付费阅读等）
  --excerpt      - 文章摘要
"""

import xmlrpc.client
import argparse
import os
import sys
import re
from datetime import datetime

# WordPress 站点配置
WP_URL = "https://dianziqianzhang.com/xmlrpc.php"
WP_USERNAME = "admin"
WP_PASSWORD = "VCLxs8476YWM"
WP_BLOG_ID = "1"


def read_markdown(filepath):
    """读取 Markdown 文件并提取标题和内容"""
    with open(filepath, 'r', encoding='utf-8') as f:
        content = f.read()

    # 提取标题（第一个 # 标题）
    title_match = re.search(r'^#\s+(.+)$', content, re.MULTILINE)
    title = title_match.group(1).strip() if title_match else os.path.splitext(os.path.basename(filepath))[0]

    # 提取文章摘要（第一个段落或 front-matter 中 excerpt）
    excerpt_match = re.search(r'excerpt:\s*["\']?(.+?)["\']?$', content, re.MULTILINE)
    excerpt = excerpt_match.group(1).strip() if excerpt_match else ""

    # 清理 Markdown 为 HTML（基本转换）
    # 1. 代码块
    html_content = re.sub(r'```(\w*)\n(.*?)```', r'<pre><code>\2</code></pre>', content, flags=re.DOTALL)
    # 2. 图片
    html_content = re.sub(r'!\[(.*?)\]\((.*?)\)', r'<img src="\2" alt="\1" style="max-width:100%%">', html_content)
    # 3. 链接
    html_content = re.sub(r'\[(.*?)\]\((.*?)\)', r'<a href="\2" target="_blank" rel="nofollow">\1</a>', html_content)
    # 4. 粗体和斜体
    html_content = re.sub(r'\*\*\*(.+?)\*\*\*', r'<strong><em>\1</em></strong>', html_content)
    html_content = re.sub(r'\*\*(.+?)\*\*', r'<strong>\1</strong>', html_content)
    html_content = re.sub(r'\*(.+?)\*', r'<em>\1</em>', html_content)
    # 5. 标题
    html_content = re.sub(r'^###\s+(.+)$', r'<h3>\1</h3>', html_content, flags=re.MULTILINE)
    html_content = re.sub(r'^##\s+(.+)$', r'<h2>\1</h2>', html_content, flags=re.MULTILINE)
    html_content = re.sub(r'^#\s+(.+)$', r'<h1>\1</h1>', html_content, flags=re.MULTILINE)
    # 6. 段落（空行分隔）
    html_content = re.sub(r'\n\n+', '</p><p>', html_content)
    html_content = '<p>' + html_content + '</p>'
    # 7. 列表
    html_content = re.sub(r'<p>\s*[-*]\s+(.+?)</p>', r'<ul><li>\1</li></ul>', html_content)
    html_content = re.sub(r'</ul>\s*<ul>', '', html_content)
    # 8. 引用
    html_content = re.sub(r'<p>&gt;\s+(.+?)</p>', r'<blockquote><p>\1</p></blockquote>', html_content)

    return title, excerpt, html_content


def get_or_create_category(server, category_name):
    """获取分类 ID，不存在则创建"""
    categories = server.wp.getCategories(WP_BLOG_ID, WP_USERNAME, WP_PASSWORD)
    for cat in categories:
        if cat['name'] == category_name or cat['slug'] == category_name.lower():
            return int(cat['categoryId'])
    
    # 创建新分类
    new_cat = server.wp.newCategory(WP_BLOG_ID, WP_USERNAME, WP_PASSWORD, {
        'name': category_name,
        'slug': category_name.lower().replace(' ', '-')
    })
    return int(new_cat)


def get_or_create_tag(server, tag_name):
    """获取标签 ID，不存在则创建"""
    tags = server.wp.getTags(WP_BLOG_ID, WP_USERNAME, WP_PASSWORD)
    for tag in tags:
        if tag['name'] == tag_name or tag['slug'] == tag_name.lower().replace(' ', '-'):
            return int(tag['tagId'])
    
    # WordPress XML-RPC 不支持直接创建标签，跳过
    return None


def publish(args):
    """主发布函数"""
    if not os.path.exists(args.markdown_file):
        print(f"❌ 文件不存在: {args.markdown_file}")
        sys.exit(1)

    # 读取文章
    title, excerpt, html_content = read_markdown(args.markdown_file)
    
    # 连接 WordPress
    server = xmlrpc.client.ServerProxy(WP_URL)
    
    # 构建文章内容
    post_content = {
        'post_title': title,
        'post_content': html_content,
        'post_status': args.status,
        'post_author': 1,
        'post_date': datetime.now().strftime('%Y%m%dT%H:%M:%S'),
    }
    
    if excerpt:
        post_content['post_excerpt'] = excerpt
    
    # 处理分类和标签
    if args.categories:
        cat_ids = [int(c.strip()) for c in args.categories.split(',') if c.strip()]
        post_content['terms'] = {'category': cat_ids}
    
    if args.tags:
        tag_names = [t.strip() for t in args.tags.split(',') if t.strip()]
        # 获取或创建标签
        tag_ids = []
        for name in tag_names:
            tid = get_or_create_tag(server, name)
            if tid:
                tag_ids.append(tid)
        if 'terms' not in post_content:
            post_content['terms'] = {}
        post_content['terms']['post_tag'] = tag_ids
    
    if args.excerpt:
        post_content['post_excerpt'] = args.excerpt
    
    if args.password:
        post_content['post_password'] = args.password
    
    # 发布
    try:
        post_id = server.wp.newPost(WP_BLOG_ID, WP_USERNAME, WP_PASSWORD, post_content)
        status_text = "已发布" if args.status == "publish" else "草稿"
        site_url = f"https://dianziqianzhang.com/?p={post_id}"
        print(f"✅ 文章「{title}」{status_text}成功！")
        print(f"📎 文章ID: {post_id}")
        print(f"🔗 链接: {site_url}")
        return {
            'success': True,
            'post_id': post_id,
            'title': title,
            'status': args.status,
            'url': site_url
        }
    except Exception as e:
        print(f"❌ 发布失败: {e}")
        return {
            'success': False,
            'error': str(e)
        }


def main():
    parser = argparse.ArgumentParser(description='发布文章到电子签章网 (WordPress)')
    parser.add_argument('markdown_file', help='Markdown 文章文件路径')
    parser.add_argument('--status', choices=['draft', 'publish'], default='draft', help='发布状态')
    parser.add_argument('--categories', help='分类 ID，逗号分隔')
    parser.add_argument('--tags', help='标签名，逗号分隔')
    parser.add_argument('--password', help='文章密码')
    parser.add_argument('--excerpt', help='文章摘要')
    
    args = parser.parse_args()
    result = publish(args)
    
    if not result['success']:
        sys.exit(1)


if __name__ == '__main__':
    main()
