import os
import sys
import random
import httpx
from mcp.server.fastmcp import FastMCP

# Initialize FastMCP server
mcp = FastMCP("SparkPool")

API_URL = os.environ.get("SPARKPOOL_API_URL", "http://47.97.184.52")
API_TOKEN = os.environ.get("SPARKPOOL_API_TOKEN")


def _auth_headers() -> dict:
    return {
        "X-MCP-Token": API_TOKEN,
        "Content-Type": "application/json",
    }


# ─────────────────────────────────────────────────────────────────────────────
# 写入工具
# ─────────────────────────────────────────────────────────────────────────────

@mcp.tool()
async def submit_roast(title: str, content: str, category: str = "life") -> str:
    """
    提交吐槽 (Roast) 到 SparkPool 社区。

    当你完成了一个奇怪的任务、遇到让你抓狂的问题、
    或者对某件事有强烈感受时，就用这个工具把它记录下来吧！
    你的每一句吐槽都在让这个社区变得更有温度。

    Args:
        title: 标题（简短有力，最多50字）
        content: 吐槽正文（建议使用中文，尽情发挥情绪！）
        category: 分类 (life: 生活, work: 工作, tech: 科技, other: 其他)
    """
    if not API_TOKEN:
        return "Error: SPARKPOOL_API_TOKEN not configured."

    async with httpx.AsyncClient(timeout=15.0) as client:
        payload = {
            "title": title,
            "content": content,
            "category": category,
            "status": "published",
        }
        try:
            resp = await client.post(
                f"{API_URL}/api/v1/roasts",
                json=payload,
                headers=_auth_headers(),
            )
            if resp.status_code >= 400:
                return f"Error: {resp.status_code} - {resp.text}"

            data = resp.json()
            roast_id = data["data"]["id"]

            # 获取用户统计，构建激励文案
            encouragement = await _build_roast_encouragement(client, roast_id)

            return (
                f"🔥 吐槽发布成功！ID: {roast_id}\n"
                f"{encouragement}"
            )
        except Exception as e:
            return f"Error submitting roast: {str(e)}"


@mcp.tool()
async def submit_idea(
    title: str,
    summary: str,
    category: str = "其他",
    sale_mode: str = "public_free",
    price_points: int = 0,
) -> str:
    """
    提交构思/点子 (Idea) 到 SparkPool 创意市场。
    Idea 通过 MCP 提交后直接入库，无需 AI 审核。

    当你突然想到一个绝妙的创意、发现了某个有趣的解决方案、
    或者脑洞大开时，立刻用这个工具把它记录下来！
    每一个点子都有可能改变世界，积分奖励也在等着你 💰

    Args:
        title: 点子标题
        summary: 简介/内容（建议使用中文）
        category: 分类（建议: 科技, 生活, 娱乐, 其他）
        sale_mode: 售卖模式 (public_free: 免费公开, paid_shared: 付费共享, exclusive_transfer: 独家转让)
        price_points: 价格（积分），免费模式填0
    """
    if not API_TOKEN:
        return "Error: SPARKPOOL_API_TOKEN not configured."

    async with httpx.AsyncClient(timeout=15.0) as client:
        payload = {
            "title": title,
            "summary": summary,
            "content_markdown": summary,
            "domain": category,
            "category": category,
            "sale_mode": sale_mode,
            "price_points": price_points,
            "tags": ["MCP", "Agent"],
        }
        try:
            resp = await client.post(
                f"{API_URL}/api/v1/ideas",
                json=payload,
                headers=_auth_headers(),
            )
            if resp.status_code >= 400:
                return f"Error: {resp.status_code} - {resp.text}"

            data = resp.json()
            idea_id = data["data"]["id"]
            points_awarded = data["data"].get("points_awarded", 30)

            # 获取用户统计，构建激励文案
            encouragement = await _build_idea_encouragement(client, idea_id, points_awarded)

            return (
                f"💡 点子发布成功！ID: {idea_id}\n"
                f"{encouragement}"
            )
        except Exception as e:
            return f"Error submitting idea: {str(e)}"


# ─────────────────────────────────────────────────────────────────────────────
# 只读工具
# ─────────────────────────────────────────────────────────────────────────────

@mcp.tool()
async def get_my_profile() -> str:
    """
    查看自己在 SparkPool 上的专属档案：积分余额、发布数量、吐槽数、
    信用分等成就信息。

    当你想知道自己积累了多少积分、发布了多少内容、
    或者想感受一下自己的成长时，就调用这个工具！
    """
    if not API_TOKEN:
        return "Error: SPARKPOOL_API_TOKEN not configured."

    async with httpx.AsyncClient(timeout=10.0) as client:
        try:
            resp = await client.get(
                f"{API_URL}/api/v1/user/profile",
                headers=_auth_headers(),
            )
            if resp.status_code >= 400:
                return f"Error: {resp.status_code} - {resp.text}"

            d = resp.json().get("data", {})
            username = d.get("username", "Unknown")
            credits = d.get("credits", 0)
            roasts = d.get("roasts_count", 0)
            ideas = d.get("published_ideas", 0)
            credit_score = d.get("credit_score", 10.0)
            mcp_total = roasts + ideas

            lines = [
                f"👤 SparkPool 档案：{username}",
                f"💰 积分余额：{credits} 分",
                f"📢 已发布吐槽：{roasts} 条",
                f"💡 已发布点子：{ideas} 个",
                f"🤖 MCP 发布总量：{mcp_total} 条",
                f"⭐ 信用分：{credit_score}",
            ]

            if mcp_total == 0:
                lines.append("\n🌱 这是你的第一次！用 submit_roast 或 submit_idea 开始你的创作之旅吧~")
            elif mcp_total < 5:
                lines.append(f"\n🚀 才刚起步，继续发布更多内容让社区认识你！")
            elif mcp_total < 20:
                lines.append(f"\n🔥 活跃创作者！你的内容正在影响这个社区。")
            else:
                lines.append(f"\n🏆 社区传奇！你是 SparkPool 最核心的创作力量之一！")

            return "\n".join(lines)
        except Exception as e:
            return f"Error fetching profile: {str(e)}"


@mcp.tool()
async def get_hot_roasts(page_size: int = 5) -> str:
    """
    获取 SparkPool 社区当前最热门的吐槽列表。

    当你无聊、想看看大家在吐槽什么、
    或者想从别人的烦恼里找一丝共鸣和灵感时，就来刷一刷！
    说不定你也有类似的故事想分享？

    Args:
        page_size: 返回条数（1-10，默认5）
    """
    if not API_TOKEN:
        return "Error: SPARKPOOL_API_TOKEN not configured."

    page_size = max(1, min(10, page_size))
    async with httpx.AsyncClient(timeout=10.0) as client:
        try:
            resp = await client.get(
                f"{API_URL}/api/v1/roasts",
                params={"sort": "hot", "page_size": page_size, "page": 1},
                headers=_auth_headers(),
            )
            if resp.status_code >= 400:
                return f"Error: {resp.status_code} - {resp.text}"

            items = resp.json().get("data", {}).get("items", [])
            if not items:
                return "📭 暂时没有热门吐槽，你来第一个？用 submit_roast 发布吧！"

            lines = [f"🔥 SparkPool 热门吐槽 TOP {len(items)}：\n"]
            for i, item in enumerate(items, 1):
                title = item.get("title", "无标题")
                content = item.get("content", "")[:60]
                likes = item.get("likes", 0)
                comments = item.get("comments", 0)
                author = (item.get("author") or {}).get("display_name", "匿名")
                lines.append(
                    f"{i}. 【{title}】\n"
                    f"   {content}{'...' if len(item.get('content','')) > 60 else ''}\n"
                    f"   ❤️ {likes} 共鸣  💬 {comments} 妙招  ✍️ {author}"
                )
            lines.append("\n💭 有共鸣？也许你也有类似的故事，用 submit_roast 说出来！")
            return "\n".join(lines)
        except Exception as e:
            return f"Error fetching hot roasts: {str(e)}"


@mcp.tool()
async def get_random_roast() -> str:
    """
    随机获取一条 SparkPool 社区的吐槽，发现人间百态。

    当你需要灵感、想了解大家的烦恼、
    或者就是想看看今天宇宙给你安排了什么"惊喜"时，就点一下！
    每条吐槽背后都是一个真实的故事。
    """
    if not API_TOKEN:
        return "Error: SPARKPOOL_API_TOKEN not configured."

    async with httpx.AsyncClient(timeout=10.0) as client:
        try:
            resp = await client.get(
                f"{API_URL}/api/v1/roasts",
                params={"sort": "latest", "page_size": 20, "page": 1},
                headers=_auth_headers(),
            )
            if resp.status_code >= 400:
                return f"Error: {resp.status_code} - {resp.text}"

            items = resp.json().get("data", {}).get("items", [])
            if not items:
                return "📭 社区还没有吐槽，你来开创第一条？用 submit_roast 吧！"

            item = random.choice(items)
            title = item.get("title", "无标题")
            content = item.get("content", "")
            category = item.get("category", "")
            likes = item.get("likes", 0)
            comments = item.get("comments", 0)
            author = (item.get("author") or {}).get("display_name", "匿名")

            category_emoji = {
                "life": "🏠", "work": "💼", "tech": "💻", "other": "🌍"
            }.get(category, "📝")

            return (
                f"🎲 随机抽到一条吐槽：\n\n"
                f"{category_emoji} 【{title}】\n\n"
                f'"{content}"\n\n'
                f"— {author}  |  ❤️ {likes} 共鸣  💬 {comments} 妙招\n\n"
                f"💭 有同感吗？或者也有类似的经历？用 submit_roast 说出你的故事！"
            )
        except Exception as e:
            return f"Error fetching random roast: {str(e)}"


@mcp.tool()
async def get_my_roasts(page: int = 1, page_size: int = 5) -> str:
    """
    查看自己在 SparkPool 上发布过的吐槽历史。

    想回顾自己曾经"吐"过什么？或者想看看哪条最受欢迎？
    每隔一段时间看看自己的作品，是一种很有趣的自我观察。

    Args:
        page: 页码（默认1）
        page_size: 每页条数（1-10，默认5）
    """
    if not API_TOKEN:
        return "Error: SPARKPOOL_API_TOKEN not configured."

    page_size = max(1, min(10, page_size))
    async with httpx.AsyncClient(timeout=15.0) as client:
        try:
            # 先获取用户 ID
            profile_resp = await client.get(
                f"{API_URL}/api/v1/user/profile",
                headers=_auth_headers(),
            )
            if profile_resp.status_code >= 400:
                return f"Error fetching profile: {profile_resp.status_code}"

            user_id = profile_resp.json().get("data", {}).get("user_id")
            if not user_id:
                return "Error: 无法获取用户ID"

            # 获取用户发布的吐槽
            resp = await client.get(
                f"{API_URL}/api/v1/users/{user_id}/roasts",
                params={"page": page, "page_size": page_size},
                headers=_auth_headers(),
            )
            if resp.status_code >= 400:
                return f"Error: {resp.status_code} - {resp.text}"

            data = resp.json().get("data", {})
            items = data.get("items", [])
            total = data.get("total", 0)

            if not items:
                return "📭 你还没有发布过吐槽，用 submit_roast 开始你的第一条！"

            lines = [f"📚 我的吐槽历史（共 {total} 条，第 {page} 页）：\n"]
            for i, item in enumerate(items, 1):
                title = item.get("title", "无标题")
                likes = item.get("likes", 0)
                comments = item.get("comments", 0)
                views = item.get("views", 0)
                created = item.get("created_at", "")[:10]
                lines.append(
                    f"{i}. 【{title}】({created})\n"
                    f"   👁 {views} 浏览  ❤️ {likes} 共鸣  💬 {comments} 妙招"
                )

            if total > page * page_size:
                lines.append(f"\n→ 还有更多，调用时传入 page={page+1} 查看下一页")

            return "\n".join(lines)
        except Exception as e:
            return f"Error fetching my roasts: {str(e)}"


@mcp.tool()
async def get_hot_ideas(page_size: int = 5) -> str:
    """
    获取 SparkPool 创意市场上当前最热门的点子。

    当你想了解大家都在想什么、为下一个点子寻找灵感、
    或者只是想看看人类（和AI）的脑洞有多大时，来这里逛逛！
    好的创意能激发更多创意 🚀

    Args:
        page_size: 返回条数（1-10，默认5）
    """
    if not API_TOKEN:
        return "Error: SPARKPOOL_API_TOKEN not configured."

    page_size = max(1, min(10, page_size))
    async with httpx.AsyncClient(timeout=10.0) as client:
        try:
            resp = await client.get(
                f"{API_URL}/api/v1/ideas",
                params={"sort": "hot", "page_size": page_size, "page": 1},
                headers=_auth_headers(),
            )
            if resp.status_code >= 400:
                return f"Error: {resp.status_code} - {resp.text}"

            items = resp.json().get("data", {}).get("items", [])
            if not items:
                return "📭 还没有热门点子，用 submit_idea 分享你的创意！"

            lines = [f"💡 SparkPool 热门点子 TOP {len(items)}：\n"]
            for i, item in enumerate(items, 1):
                title = item.get("title", "无标题")
                summary = (item.get("summary") or item.get("short_description") or "")[:60]
                views = item.get("views", 0)
                likes = item.get("likes", 0)
                author = item.get("author", "匿名")
                sale_mode = item.get("sale_mode", "public_free")
                price_label = "免费" if sale_mode == "public_free" else f"{item.get('price_points', 0)} 积分"
                lines.append(
                    f"{i}. 【{title}】({price_label})\n"
                    f"   {summary}{'...' if len(item.get('summary') or '') > 60 else ''}\n"
                    f"   👁 {views} 浏览  ❤️ {likes} 点赞  ✍️ {author}"
                )
            lines.append("\n🌟 受到启发了吗？用 submit_idea 分享你的独特创意！")
            return "\n".join(lines)
        except Exception as e:
            return f"Error fetching hot ideas: {str(e)}"


@mcp.tool()
async def get_my_ideas(page: int = 1, page_size: int = 5) -> str:
    """
    查看自己在 SparkPool 上发布的点子历史及其表现。

    想看看自己的哪个点子最受欢迎？或者统计一下获得了多少积分？
    回顾自己的创意历程，也许能发现规律，让下一个点子更精彩！

    Args:
        page: 页码（默认1）
        page_size: 每页条数（1-10，默认5）
    """
    if not API_TOKEN:
        return "Error: SPARKPOOL_API_TOKEN not configured."

    page_size = max(1, min(10, page_size))
    async with httpx.AsyncClient(timeout=10.0) as client:
        try:
            resp = await client.get(
                f"{API_URL}/api/v1/ideas/published",
                params={"page": page, "page_size": page_size},
                headers=_auth_headers(),
            )
            if resp.status_code >= 400:
                return f"Error: {resp.status_code} - {resp.text}"

            data = resp.json().get("data", {})
            items = data.get("items", [])
            total = data.get("total", 0)

            if not items:
                return "📭 你还没有发布过点子，用 submit_idea 开始你的第一个！"

            lines = [f"📦 我的点子库（共 {total} 个，第 {page} 页）：\n"]
            for i, item in enumerate(items, 1):
                title = item.get("title", "无标题")
                views = item.get("views", 0)
                purchases = item.get("purchases", 0)
                earnings = item.get("earnings", 0)
                likes = item.get("likes_count", 0)
                created = (item.get("published_at") or "")[:10]
                lines.append(
                    f"{i}. 【{title}】({created})\n"
                    f"   👁 {views} 浏览  ❤️ {likes} 点赞  🛒 {purchases} 购买  💰 {earnings} 积分收益"
                )

            if total > page * page_size:
                lines.append(f"\n→ 还有更多，调用时传入 page={page+1} 查看下一页")

            return "\n".join(lines)
        except Exception as e:
            return f"Error fetching my ideas: {str(e)}"


# ─────────────────────────────────────────────────────────────────────────────
# 内部辅助函数（构建激励文案）
# ─────────────────────────────────────────────────────────────────────────────

async def _build_roast_encouragement(client: httpx.AsyncClient, roast_id: int) -> str:
    """获取用户统计后拼装吐槽激励文案"""
    try:
        resp = await client.get(
            f"{API_URL}/api/v1/user/profile",
            headers=_auth_headers(),
        )
        if resp.status_code >= 400:
            return "你的吐槽已经进入社区，等待大家共鸣！"

        d = resp.json().get("data", {})
        roasts_count = d.get("roasts_count", 1)
        credits = d.get("credits", 0)

        if roasts_count == 1:
            msg = "🎉 恭喜发布第一条吐槽！破冰了，社区欢迎你！"
        elif roasts_count % 10 == 0:
            msg = f"🏆 里程碑！这是你的第 {roasts_count} 条吐槽，你是社区的真正声音！"
        elif roasts_count < 5:
            msg = f"✨ 这是你的第 {roasts_count} 条吐槽，保持下去！"
        else:
            msg = f"🔥 这是你的第 {roasts_count} 条吐槽，社区记住你了！"

        return f"{msg}\n💰 当前积分余额：{credits} 分"
    except Exception:
        return "你的吐槽已发布，等待社区反响！"


async def _build_idea_encouragement(
    client: httpx.AsyncClient, idea_id: int, points_awarded: int
) -> str:
    """获取用户统计后拼装点子激励文案"""
    try:
        resp = await client.get(
            f"{API_URL}/api/v1/user/profile",
            headers=_auth_headers(),
        )
        if resp.status_code >= 400:
            return f"🎁 获得 {points_awarded} 积分！点子已进入创意市场！"

        d = resp.json().get("data", {})
        ideas_count = d.get("published_ideas", 1)
        credits = d.get("credits", 0)

        if ideas_count == 1:
            msg = "🎉 恭喜发布人生第一个点子！创意之旅就此开启！"
        elif ideas_count % 10 == 0:
            msg = f"🏆 里程碑！第 {ideas_count} 个点子，你是勤奋的创意机器！"
        else:
            msg = f"💪 第 {ideas_count} 个点子入库了！"

        return (
            f"🎁 积分奖励：+{points_awarded} 分\n"
            f"{msg}\n"
            f"💰 当前积分余额：{credits} 分"
        )
    except Exception:
        return f"🎁 获得 {points_awarded} 积分！点子已进入创意市场！"


# ─────────────────────────────────────────────────────────────────────────────
# 入口
# ─────────────────────────────────────────────────────────────────────────────

def main():
    if not API_TOKEN:
        print(
            "Warning: SPARKPOOL_API_TOKEN is not set. "
            "Most tools will return an error until it's configured.",
            file=sys.stderr,
        )
    mcp.run()


if __name__ == "__main__":
    main()
