#!/usr/bin/env python3
"""
铁塔计算小工具 (Tower Calculation Tool)
=====================================
输入抗风级别、塔高、塔型、材质等参数,
自动生成铁塔计算书(Word文档)和铁塔图纸(PNG图片)。

使用方法:
    命令行模式:
        python main.py --wind-level 10 --height 30 --type 自立塔 --material Q345
    交互模式:
        python main.py -i
    默认参数:
        python main.py

依赖: matplotlib, python-docx, numpy
"""

import argparse
import os
import sys

from tower_calc import TowerCalculator, WIND_LEVEL_TABLE, MATERIAL_PROPS, VOLTAGE_PARAMS, WIRE_TABLE
from tower_draw import TowerDrawer
from report_gen import ReportGenerator


def parse_args():
    parser = argparse.ArgumentParser(
        description="铁塔计算小工具 - 输入参数自动生成铁塔计算书和图纸",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例:
  python main.py --wind-level 10 --height 30 --type 自立塔 --material Q345
  python main.py --wind-level 12 --height 45 --type 自立塔 --material Q345 --voltage 220kV
  python main.py -i  (交互模式)
        """)
    parser.add_argument("--wind-level", type=int, default=10,
                        help="抗风级别 (8-17级),默认10级")
    parser.add_argument("--height", type=float, default=30,
                        help="塔高(m),默认30m")
    parser.add_argument("--type", dest="tower_type", default="自立塔",
                        choices=["自立塔", "拉线塔", "单杆塔"],
                        help="塔型:自立塔/拉线塔/单杆塔,默认自立塔")
    parser.add_argument("--material", default="Q345",
                        choices=list(MATERIAL_PROPS.keys()),
                        help="材质:Q235/Q345/Q390/Q420,默认Q345")
    parser.add_argument("--voltage", default="110kV",
                        choices=list(VOLTAGE_PARAMS.keys()),
                        help="电压等级,默认110kV")
    parser.add_argument("--wire", default="LGJ-240/30",
                        choices=list(WIRE_TABLE.keys()),
                        help="导线型号,默认LGJ-240/30")
    parser.add_argument("--wire-count", type=int, default=3,
                        help="导线根数,默认3")
    parser.add_argument("--terrain", default="B",
                        choices=["A", "B", "C", "D"],
                        help="地形类别:A/B/C/D,默认B")
    parser.add_argument("--safety-level", type=int, default=2,
                        choices=[1, 2, 3],
                        help="安全等级:1/2/3,默认2")
    parser.add_argument("-i", "--interactive", action="store_true",
                        help="交互输入模式")
    parser.add_argument("--output-dir", default="output",
                        help="输出目录,默认output")
    return parser.parse_args()


def interactive_input():
    """交互式输入参数"""
    print("=" * 50)
    print("    铁塔计算小工具 - 参数输入")
    print("=" * 50)

    print(f"\n可选抗风级别: {sorted(WIND_LEVEL_TABLE.keys())}")
    wind_level = int(input("请输入抗风级别 [默认10]: ") or "10")

    height = float(input("请输入塔高(m) [默认30]: ") or "30")

    print("可选塔型: 自立塔, 拉线塔, 单杆塔")
    tower_type = input("请输入塔型 [默认自立塔]: ") or "自立塔"

    print(f"可选材质: {list(MATERIAL_PROPS.keys())}")
    material = input("请输入材质 [默认Q345]: ") or "Q345"

    print(f"可选电压等级: {list(VOLTAGE_PARAMS.keys())}")
    voltage = input("请输入电压等级 [默认110kV]: ") or "110kV"

    print(f"可选导线: {list(WIRE_TABLE.keys())}")
    wire = input("请输入导线型号 [默认LGJ-240/30]: ") or "LGJ-240/30"

    wire_count = int(input("请输入导线根数 [默认3]: ") or "3")

    print("可选地形: A, B, C, D")
    terrain = input("请输入地形类别 [默认B]: ") or "B"

    safety = int(input("请输入安全等级(1/2/3) [默认2]: ") or "2")

    return {
        "wind_level": wind_level,
        "tower_height": height,
        "tower_type": tower_type,
        "material": material,
        "voltage": voltage,
        "wire_type": wire,
        "wire_count": wire_count,
        "terrain_type": terrain,
        "safety_level": safety,
    }


def run_calculation(params, output_dir="output"):
    """执行完整计算流程"""
    os.makedirs(output_dir, exist_ok=True)

    print("\n" + "=" * 60)
    print("  铁塔结构计算")
    print("=" * 60)

    print("\n【输入参数】")
    for k, v in params.items():
        print(f"  {k:20s}: {v}")

    # 1. 结构计算
    print("\n[1/3] 正在执行结构计算...")
    calc = TowerCalculator(**params)
    results = calc.run_all()
    print("  ✓ 计算完成")

    # 打印关键结果
    print("\n【计算结果摘要】")
    print(f"  设计风速        : {results.get('设计风速', 0):.1f} m/s")
    print(f"  基本风压        : {results.get('基本风压_w0', 0):.4f} kN/m²")
    print(f"  塔身总风荷载    : {results.get('塔身总风荷载', 0):.2f} kN")
    print(f"  导线风荷载      : {results.get('导线风荷载', 0):.2f} kN")
    print(f"  基底弯矩        : {results.get('基底弯矩', 0):.2f} kN·m")
    print(f"  基底剪力        : {results.get('基底剪力', 0):.2f} kN")
    print(f"  基底轴力        : {results.get('基底轴力', 0):.2f} kN")
    print(f"  主材规格        : {results.get('主材规格', 'N/A')}")
    print(f"  主材应力比      : {results.get('应力比', 0):.3f}")
    print(f"  基础边长        : {results.get('基础边长', 0):.2f} m")
    print(f"  抗倾覆系数      : {results.get('整体抗倾覆系数', 0):.3f}")
    print(f"  抗滑移系数      : {results.get('整体抗滑移系数', 0):.3f}")

    member_ok = "✓通过" if results.get('主材验算通过') else "✗不通过"
    found_ok = "✓通过" if results.get('基础验算通过') else "✗不通过"
    stab_ok = "✓通过" if results.get('整体稳定验算通过') else "✗不通过"
    print(f"\n  主材验算: {member_ok}  基础验算: {found_ok}  整体稳定: {stab_ok}")

    # 2. 绘制图纸
    print("\n[2/3] 正在绘制铁塔图纸...")
    drawer = TowerDrawer(results, params)
    img_paths = drawer.draw_all(output_dir)
    print(f"  ✓ 立面图: {img_paths.get('立面图', '')}")
    print(f"  ✓ 截面图: {img_paths.get('截面图', '')}")
    print(f"  ✓ 内力图: {img_paths.get('内力图', '')}")

    # 3. 生成计算书
    print("\n[3/3] 正在生成计算书(Word文档)...")
    report = ReportGenerator(results, params)
    report_path = os.path.join(output_dir, "tower_calc_report.docx")
    report.generate(report_path)
    print(f"  ✓ 计算书: {report_path}")

    print("\n" + "=" * 60)
    print("  全部完成!输出文件在:", output_dir)
    print("=" * 60)

    return results, img_paths, report_path


def main():
    args = parse_args()

    if args.interactive:
        params = interactive_input()
    else:
        params = {
            "wind_level": args.wind_level,
            "tower_height": args.height,
            "tower_type": args.tower_type,
            "material": args.material,
            "voltage": args.voltage,
            "wire_type": args.wire,
            "wire_count": args.wire_count,
            "terrain_type": args.terrain,
            "safety_level": args.safety_level,
        }

    run_calculation(params, args.output_dir)


if __name__ == "__main__":
    main()