from flask import Flask, request, jsonify, send_from_directory, abort, render_template_string, Response, stream_with_context
import requests
import os

app = Flask(__name__)

GAME_SERVER_URL = "http://127.0.0.1:8080/gameapi/"
DOWNLOAD_DIR = r"D:\game"

os.makedirs(DOWNLOAD_DIR, exist_ok=True)

# ---------- 游戏规则数据（中英文资源对照）----------
RESOURCE_CHINESE = {
    "Wood": "木材", "Stone": "石头", "Clay": "粘土", "Coal": "煤炭", "Sand": "沙子", "Lime": "石灰",
    "IronOre": "铁矿", "CopperOre": "铜矿", "AluminumOre": "铝矿", "SilverOre": "银矿", "TungstenOre": "钨矿",
    "Magnetite": "磁铁矿", "Cryolite": "冰晶石", "Monazite": "独居石", "Saltpeter": "硝石", "Sulfur": "硫磺",
    "Silicon": "硅", "ZincOre": "锌矿", "LeadOre": "铅矿", "Chromite": "铬矿", "MercuryOre": "汞矿",
    "NickelOre": "镍矿", "ManganeseOre": "锰矿", "Pyrolusite": "软锰矿", "Diamond": "金刚石",
    "Chalcanthite": "胆矾", "Copperas": "绿矾", "Iron": "铁", "Copper": "铜", "Aluminum": "铝",
    "Silver": "银", "Lead": "铅", "Chromium": "铬", "Nickel": "镍", "Mercury": "汞", "Tungsten": "钨",
    "Manganese": "锰", "Zinc": "锌", "SulfuricAcid": "硫酸", "NitricAcid": "硝酸", "Hydrogen": "氢气",
    "Bromine": "溴", "Methane": "甲烷", "Bromomethane": "一溴甲烷", "Toluene": "甲苯", "TNT": "TNT",
    "Linen": "亚麻", "Wheat": "小麦", "Cabbage": "白菜", "Flour": "面粉", "Dough": "面团", "Bread": "面包",
    "LinenCloth": "麻布", "Glass": "玻璃", "Gunpowder": "黑火药", "ExplosivePack": "炸药包",
    "SteamEngine": "蒸汽机", "Motor": "电机", "WireSwitch": "导线开关", "WindWheel": "风轮", "Tower": "塔架",
    "WindGenerator": "风力发电机", "WoodenBucket": "木桶", "IronBucket": "铁桶", "WindSock": "风向袋",
    "Hub": "轮毂", "WindCup": "风杯", "ThermometerScreen": "百叶箱", "Condenser": "冷凝管",
    "Thermometer": "温度计", "Millstone": "石磨", "FlourProduct": "面粉产品", "ManganeseDioxide": "二氧化锰",
    "ZincManganeseBattery": "锌锰电池", "Drill": "钻头", "Accumulator": "蓄电池", "StainlessSteel": "不锈钢",
    "Electrolyzer": "电解池", "SmallWaterTank": "小储水罐", "WaterTank": "储水罐", "LargeWaterTank": "大储水罐",
    "Hygrometer": "湿度计", "RainGauge": "雨量计", "TungstenFilament": "钨丝", "Bulb": "灯泡",
    "FermentedDough": "发酵面糊", "BreadProduct": "面包产品", "WoodenBoat": "木船", "AdvancedWoodenBoat": "高级木船",
    "Ironclad": "铁甲舰", "WeatherShip": "测风船", "SolarPanel": "太阳能板", "StoneAxe": "石斧",
    "StonePickaxe": "石镐", "IronAxe": "铁斧", "IronPickaxe": "铁镐", "Saw": "锯", "CoinCopper": "铜币",
    "CoinAluminum": "铝币", "CoinSilver": "银币", "CoinMold": "铸币模具", "SeedLinen": "亚麻种子",
    "SeedWheatSpring": "春小麦种子", "SeedWheatWinter": "冬小麦种子", "SeedCabbage": "白菜种子",
    "Pork": "猪肉", "Beef": "牛肉", "Milk": "牛奶", "Leather": "皮革", "Population": "人口",
    "IronOxide": "氧化铁", "Quicklime": "生石灰", "Charcoal": "木炭", "Water": "水", "Oxygen": "氧气",
    "Seawater": "海水", "Benzene": "苯", "Meat": "肉", "Fish": "鱼", "Steel": "钢", "Cannon": "火炮",
    "Cannonball": "炮弹", "Wolf": "狼", "WildBoar": "野猪", "WildBison": "野牛", "WildCat": "野猫",
    "Rat": "老鼠", "Snake": "蛇", "Mosquito": "蚊子", "Cockroach": "蟑螂", "Fly": "苍蝇"
}

def generate_index_html():
    # 生成资源表格
    resource_rows = ""
    sorted_items = sorted(RESOURCE_CHINESE.items(), key=lambda x: x[1])
    for eng, chn in sorted_items:
        resource_rows += f"<tr><td>{chn}</td><td>{eng}</td></tr>"

    html = f"""
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>国家争霸赛 联机版</title>
    <style>
        body {{ font-family: 'Segoe UI', sans-serif; background: linear-gradient(135deg, #1e3c72, #2a5298); color: white; padding: 20px; }}
        .container {{ max-width: 1200px; margin: auto; background: rgba(255,255,255,0.1); backdrop-filter: blur(10px); border-radius: 20px; padding: 30px; }}
        h1, h2, h3 {{ color: #ffd700; }}
        h2 {{ border-bottom: 2px solid #ff9800; padding-bottom: 5px; }}
        table {{ border-collapse: collapse; width: 100%; margin: 15px 0; background: rgba(255,255,255,0.2); color: white; }}
        th, td {{ border: 1px solid #ddd; padding: 8px; text-align: left; }}
        th {{ background-color: #ff9800; color: black; }}
        .download-section {{ text-align: center; margin-bottom: 30px; }}
        .download-btn {{ display: inline-block; margin: 10px; padding: 15px 30px; background: #ff9800; color: white; text-decoration: none; border-radius: 50px; font-weight: bold; }}
        .download-btn:hover {{ background: #ff5722; }}
        .note {{ background-color: #e7f3fe; color: #333; border-left: 6px solid #2196F3; padding: 10px; margin: 15px 0; }}
        ul {{ columns: 2; -webkit-columns: 2; -moz-columns: 2; }}
        .footer {{ margin-top: 30px; font-size: 0.9em; text-align: center; }}
    </style>
</head>
<body>
    <div class="container">
        <h1 style="text-align:center;">⚔️ 国家争霸赛 联机版 ⚔️</h1>

        <div class="download-section">
            <p>点击下方按钮下载游戏文件</p>
            <a href="/download/GameServer.exe" class="download-btn">📥 服务器端</a>
            <a href="/download/GameClient.exe" class="download-btn">📥 客户端</a>
            <a href="/download/map.png" class="download-btn">🗺️ 地图文件</a>
            <a href="/download/GameServer.cs" class="download-btn">📄 服务器源代码</a>
            <a href="/download/GameClient.cs" class="download-btn">📄 客户端源代码</a>
            <a href="/download/app.py" class="download-btn">🐍 代理源代码</a>
        </div>

        <div class="note">
            <strong>客户端设置：</strong> 代理地址请填写 <code>{request.host_url}api/proxy</code>，确保服务器端已在本地运行（监听8080端口）。
        </div>

        <h2>📜 游戏规则大全</h2>

        <h3>一、游戏时间</h3>
        <ul>
            <li>时间点系统：每现实天对应32时间点，每游戏日4时间点（每6小时一个时间点）。</li>
            <li>游戏日期：从元年1月1日0时开始，每4时间点增加一天。</li>
            <li>季节：每90天为一个季节，顺序：春、夏、秋、冬。部分种植受季节限制。</li>
        </ul>

        <h3>二、国家属性</h3>
        <ul>
            <li><strong>民心</strong>：影响人口增长和税收，低民心可能导致叛乱。</li>
            <li><strong>军心</strong>：影响军队士气和战斗力。</li>
            <li><strong>威望</strong>：影响外交和事件。</li>
            <li><strong>权利</strong>：影响政策执行和权臣出现。</li>
            <li><strong>人口</strong>：影响最大行动次数和建筑条件。最大人口由住房决定。</li>
        </ul>

        <h3>三、资源列表</h3>
        <p>游戏中包含以下资源（客户端按钮上显示中文名）：</p>
        <table>
            <tr><th>中文名</th><th>英文标识</th></tr>
            {resource_rows}
        </table>

        <h3>四、工具与采集</h3>
        <ul>
            <li>工具类型：石斧、石镐、铁斧、铁镐、锯、钻头等。工具可减少对应资源的采集时间。</li>
            <li>采集基础时间：木材/石头20，粘土/沙子16，铁矿/铜矿24，钨矿/金刚石40，其他参见客户端提示。</li>
            <li>工具减时：石制工具-4，铁制工具-8，锯/钻头-12。</li>
            <li>每次采集固定产出20单位资源。</li>
        </ul>

        <h3>五、操作类型</h3>
        <p>所有操作均可附加工资（铜币/铝币/银币），工资总额每5点使产出倍数+1（不足5按1倍计算）。不发工资则无加成。</p>
        <ul>
            <li><strong>采集</strong>：基础耗时20-40，受工具影响，产出20资源。</li>
            <li><strong>冶炼</strong>：需要熔炉、煤炭、石灰/冰晶石，耗时20-40，产出1金属。</li>
            <li><strong>建造</strong>：消耗资源，获得建筑或工具，耗时1-24，具体成本见客户端按钮提示。</li>
            <li><strong>化工</strong>：需要特定建筑和原料，产出化工产品（硫酸、硝酸、TNT等）。</li>
            <li><strong>种植</strong>：需要种子和合适季节，耗时320-880，收获20作物。</li>
            <li><strong>狩猎</strong>：需要斧头，耗时40，获得肉和皮革（野猪得猪肉，野牛得牛肉+皮革）。</li>
            <li><strong>驯化</strong>：需要食物，耗时20，获得动物（狼变狗，野猫变家猫）。</li>
            <li><strong>民心行动</strong>：耗时4，提升民心/军心/威望等，具体效果见按钮描述。</li>
            <li><strong>铸币</strong>：需要铸币模具，消耗1金属产出5硬币，耗时1。</li>
            <li><strong>备战/宣战</strong>：耗时8，标记目标国家。</li>
            <li><strong>进攻</strong>：对宣战国发动普通进攻（耗时8，每轮一次，造成15伤害）。</li>
            <li><strong>轰炸</strong>：消耗2炸药包，造成30伤害，耗时8。</li>
            <li><strong>火炮</strong>：消耗1火炮、1炮弹、1黑火药，造成40伤害，耗时8。</li>
            <li><strong>制造</strong>：制造火炮（消耗20钢，耗时16）或炮弹（消耗1钢，耗时16）。</li>
            <li><strong>裁兵</strong>：裁撤士兵（先普通后精兵），精兵被裁降低军心威望。</li>
            <li><strong>训练精兵</strong>：将普通兵转为精兵，精兵每天消耗1面包。</li>
            <li><strong>撤销精兵</strong>：精兵降为普通兵。</li>
            <li><strong>停工/复工</strong>：停止或恢复自动生产建筑的运作。</li>
        </ul>

        <h3>六、建筑列表（部分）</h3>
        <ul>
            <li>工具类：石斧、石镐、铁斧、铁镐、锯、钻头</li>
            <li>船类：木船、高级木船、铁甲舰、测风船</li>
            <li>生产建筑：窑、高炉、熔炉、织布机、伐木场(1/2级)、采石场(1/2级)、锯木厂、切石机、铸造厂、轧钢厂、化工厂(1级)、电解池、电池厂等</li>
            <li>发电：蒸汽机、电机、风力发电机、太阳能板</li>
            <li>民生：木房、木石房、牧场、水井、面包房、熏制房、奶酪厂、养蜂场等</li>
            <li>气象：百叶箱、风向袋、风杯、温度计、湿度计、雨量计、测风站等</li>
            <li>军事：火炮（资源）、炮弹（资源）</li>
            <li>特殊：铸币模具</li>
        </ul>

        <h3>七、自动生产建筑</h3>
        <ul>
            <li>伐木场、采石场、锯木厂、切石机、铸造厂、轧钢厂等会每4时间点自动产出对应资源。</li>
            <li>可以手动停工（停止产出，也不发工资）或复工。</li>
            <li>每月15日自动支付工资（每个建筑基础30货币），若国库不足则民心威望大幅下降。</li>
        </ul>

        <h3>八、税收与公司</h3>
        <ul>
            <li>可设置公司税和个人所得税，支持线性或累进税率。</li>
            <li>公司每月产生利润，每年1月1日分红，政府收取公司税，个人收取红利税。</li>
            <li>个人所得税可选择是否对收入（每月民间货币增量）征税。</li>
        </ul>

        <h3>九、战争机制</h3>
        <ul>
            <li>必须先备战，再宣战，才能发动进攻。</li>
            <li>每现实天只能发动一次进攻（包括普通、轰炸、火炮）。</li>
            <li>每次进攻增加对方投降进度，达到100时对方投降（当前版本仅移除敌对方）。</li>
            <li>宣战半年后需支付承诺的军饷，否则军心大降。</li>
        </ul>

        <h3>十、精兵系统</h3>
        <ul>
            <li>精兵由普通兵训练而来，训练消耗普通兵名额，不额外消耗资源。</li>
            <li>每个精兵每天消耗1面包，若面包不足，则未获得面包的精兵被裁撤，并降低军心威望。</li>
            <li>精兵被裁撤时同样降低军心威望。</li>
        </ul>

        <h3>十一、事件与惩罚</h3>
        <ul>
            <li>过度建造（每3.5天检查，超过人口/20的建造数）会降低民心威望。</li>
            <li>过度宣战（每60时间点检查，超过2次）会降低民心军心威望。</li>
            <li>弱君主（威望<50且无为而治超过1.5年）持续降低威望军心。</li>
            <li>权臣（权利<30时有概率出现）影响国家稳定。</li>
            <li>随机事件：丰收、瘟疫、野兽袭击、发现矿脉等。</li>
        </ul>

        <h3>十二、操作限制</h3>
        <ul>
            <li>每个时间点内（即每个游戏小时）最多行动次数：人口<500为1，≥500为2。</li>
            <li>每轮（现实天）最多行动次数：基础8次，人口每200增加1次，最多16次。若无任何货币，则降为2次。</li>
        </ul>

        <div class="note">
            <p>⚠️ 以上规则基于代码整理，实际游戏时请以客户端显示为准。如有疑问，可查看客户端源代码或联系管理员。</p>
        </div>

        <div class="footer">
            —— 国家争霸赛开发组 ——
        </div>
    </div>
</body>
</html>
    """
    return html

@app.route('/')
def index():
    return generate_index_html()

@app.route('/test')
def test():
    return "OK", 200

@app.route('/download/<filename>')
def download_file(filename):
    file_path = os.path.join(DOWNLOAD_DIR, filename)
    if os.path.exists(file_path):
        return send_from_directory(DOWNLOAD_DIR, filename, as_attachment=True)
    else:
        abort(404, description="文件不存在")

# 统一代理入口
@app.route('/api/proxy', methods=['POST', 'GET'])
def proxy():
    # 解析请求（支持 JSON 或表单）
    if request.method == 'POST':
        data = request.get_json(silent=True) or {}
    else:
        data = request.args.to_dict()

    action = data.get('action')
    player_id = data.get('playerId')
    params = data.get('params', {})

    try:
        # 地图 SSE 流（被动推送）
        if action == 'map_sse':
            # 转发到后端 SSE 端点，并保持流式响应
            resp = requests.get(GAME_SERVER_URL + 'map-sse', stream=True, timeout=None)
            return Response(
                stream_with_context(resp.iter_content(chunk_size=1024)),
                status=resp.status_code,
                content_type=resp.headers.get('Content-Type', 'text/event-stream')
            )

        # 地图图片下载
        elif action == 'map_image':
            resp = requests.get(GAME_SERVER_URL + 'map-image', stream=True)
            return Response(
                stream_with_context(resp.iter_content(chunk_size=1024)),
                status=resp.status_code,
                content_type=resp.headers.get('Content-Type', 'image/png')
            )

        # 其他操作
        else:
            # 构建目标 URL
            if action == 'register':
                target_url = GAME_SERVER_URL + 'register'
                payload = {'nation': data.get('nation'), 'playerId': player_id}
            elif action == 'nations':
                target_url = GAME_SERVER_URL + 'nations'
                payload = None
            elif action == 'state':
                target_url = GAME_SERVER_URL + f'state?playerId={player_id}'
                payload = None
            elif action == 'action':
                target_url = GAME_SERVER_URL + 'action'
                payload = {
                    'playerId': player_id,
                    'actionType': params.get('type'),
                    'param': params.get('param', ''),
                    'wage': params.get('wage', 0),
                    'currency': params.get('currency', 'CoinCopper'),
                    'wageCopper': params.get('wageCopper', 0),
                    'wageAluminum': params.get('wageAluminum', 0),
                    'wageSilver': params.get('wageSilver', 0)
                }
            elif action == 'delete':
                target_url = GAME_SERVER_URL + 'delete'
                payload = {'playerId': player_id, 'params': {'index': params.get('index')}}
            elif action == 'message':
                target_url = GAME_SERVER_URL + 'message'
                payload = None
            else:
                return jsonify({'error': '未知操作'}), 400

            # 发送请求
            if payload is not None:
                resp = requests.post(target_url, json=payload, timeout=10)
            else:
                resp = requests.get(target_url, timeout=10)

            return Response(
                resp.content,
                status=resp.status_code,
                content_type=resp.headers.get('Content-Type', 'application/json')
            )

    except requests.exceptions.Timeout:
        return jsonify({'error': '后端服务器超时'}), 504
    except requests.exceptions.ConnectionError:
        return jsonify({'error': '无法连接到后端服务器，请确保其已启动'}), 502
    except Exception as e:
        return jsonify({'error': str(e)}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000, debug=True)