#!/root/.openclaw/workspace/venv/bin/python3
"""
A股个股深度分析 - 一键生成10环节完整报告
全实时数据源，禁止本地数据库

使用方法:
    ./venv_runner.sh skills/a-stock-analysis/scripts/analyze_stock.py --code 300570 --name 太辰光
    ./venv_runner.sh skills/a-stock-analysis/scripts/analyze_stock.py --code 600875 --name 东方电气
"""

import sys
import os
import json
import argparse
import requests
from datetime import datetime

# 添加工具路径
sys.path.insert(0, '/root/.openclaw/workspace/skills/a-stock-analysis/tools')
sys.path.insert(0, '/root/.openclaw/workspace/skills/short-term-analysis/scripts')

from stock_data_collector import StockDataCollector
from analyze_short_term import ShortTermAnalyzer

# 长桥API
from longport.openapi import QuoteContext, Config, AdjustType, Period

WORKSPACE = '/root/.openclaw/workspace'
REPORTS_DIR = f'{WORKSPACE}/reports'

class StockAnalyzer:
    """个股分析器 - 全实时数据源"""
    
    def __init__(self):
        self.data = {}
        
    def get_longbridge_data(self, ts_code):
        """获取长桥实时数据（主要数据源）"""
        try:
            config = Config.from_env()
            ctx = QuoteContext(config)
            lb_code = ts_code.upper().replace('.SH', '.SS')
            
            # 实时行情
            quote = ctx.quote([lb_code])
            if not quote:
                return None
            
            q = quote[0]
            price_data = {
                'price': float(q.last_done) if hasattr(q, 'last_done') else None,
                'open': float(q.open) if hasattr(q, 'open') else None,
                'high': float(q.high) if hasattr(q, 'high') else None,
                'low': float(q.low) if hasattr(q, 'low') else None,
                'volume': int(q.volume) if hasattr(q, 'volume') else None,
                'turnover': float(q.turnover) if hasattr(q, 'turnover') else None,
                'source': '长桥API',
                'time': datetime.now().strftime('%H:%M:%S')
            }
            
            # 股本数据
            static = ctx.static_info([lb_code])
            if static:
                s = static[0]
                price_data['total_shares'] = float(s.total_shares) if hasattr(s, 'total_shares') else None
                price_data['circulating_shares'] = float(s.circulating_shares) if hasattr(s, 'circulating_shares') else None
            
            # K线数据（计算近期涨幅）
            try:
                candles = ctx.candlesticks(lb_code, Period.Day, 30, AdjustType.NoAdjust)
                closes = [float(c.close) for c in candles]
                if len(closes) >= 5:
                    price_data['change_5d'] = (closes[-1] - closes[-5]) / closes[-5] * 100
                if len(closes) >= 20:
                    price_data['change_20d'] = (closes[-1] - closes[-20]) / closes[-20] * 100
                    price_data['ma_20'] = sum(closes[-20:]) / 20
                if len(closes) >= 60:
                    price_data['change_60d'] = (closes[-1] - closes[-60]) / closes[-60] * 100
                    price_data['ma_60'] = sum(closes[-60:]) / 60
                # 计算技术指标
                if len(closes) >= 14:
                    price_data['price_pos_20'] = (closes[-1] - min(closes[-20:])) / (max(closes[-20:]) - min(closes[-20:])) * 100 if max(closes[-20:]) != min(closes[-20:]) else 50
            except Exception as e:
                print(f"    [WARN] K线数据获取失败: {e}")
            
            return price_data
        except Exception as e:
            print(f"[WARN] 长桥数据获取失败: {e}")
            return None
    
    def get_eastmoney_valuation(self, ts_code):
        """获取东方财富估值数据"""
        try:
            if ts_code.endswith('.SH'):
                code = f"1.{ts_code.replace('.SH', '')}"
            else:
                code = f"0.{ts_code.replace('.SZ', '')}"
            
            url = f'https://push2.eastmoney.com/api/qt/stock/get?ut=fa5fd1943c7b386f172d6893dbfba10b&fltt=2&invt=2&volt=2&fields=f43,f44,f45,f46,f47,f48,f50,f51,f52,f57,f58,f60,f162,f167,f170,f171,f177,f168&secid={code}'
            r = requests.get(url, timeout=10)
            data = r.json()
            
            if data.get('data'):
                d = data['data']
                return {
                    'pe': float(d.get('f162', 0)) if d.get('f162') else None,
                    'pb': float(d.get('f167', 0)) if d.get('f167') else None,
                    'turnover_rate': float(d.get('f168', 0)) if d.get('f168') else None,
                    'total_mv': float(d.get('f48', 0)) / [REDACTED_PHONE] if d.get('f48') else None,
                    'source': '东方财富',
                    'time': datetime.now().strftime('%H:%M:%S')
                }
        except Exception as e:
            print(f"[WARN] 东方财富数据获取失败: {e}")
        return None
    
    def get_qq_valuation(self, ts_code):
        """腾讯财经备选数据源"""
        try:
            code = ts_code.replace('.SH', '').replace('.SZ', '')
            prefix = 'sh' if ts_code.endswith('.SH') else 'sz'
            url = f'https://qt.gtimg.cn/q={prefix}{code}'
            r = requests.get(url, timeout=10)
            parts = r.text.split('~')
            if len(parts) > 50:
                # 解析腾讯财经数据字段
                # 根据返回数据: parts[39]=PE, parts[46]=PB, parts[44]=总市值
                pe_val = parts[39] if len(parts) > 39 else None
                pb_val = parts[46] if len(parts) > 46 else None
                mv_val = parts[44] if len(parts) > 44 else None
                
                return {
                    'pe': float(pe_val) if pe_val and pe_val.replace('.', '').replace('-', '').isdigit() else None,
                    'pb': float(pb_val) if pb_val and pb_val.replace('.', '').replace('-', '').isdigit() else None,
                    'total_mv': float(mv_val) if mv_val and mv_val.replace('.', '').replace('-', '').isdigit() else None,
                    'source': '腾讯财经',
                    'time': datetime.now().strftime('%H:%M:%S')
                }
        except Exception as e:
            print(f"[WARN] 腾讯财经数据获取失败: {e}")
        return None
    
    def get_sina_finance(self, ts_code):
        """新浪财经财务数据"""
        try:
            code = ts_code.replace('.SH', '').replace('.SZ', '')
            prefix = 'sh' if ts_code.endswith('.SH') else 'sz'
            url = f'https://hq.sinajs.cn/list={prefix}{code}'
            headers = {'Referer': 'https://finance.sina.com.cn'}
            r = requests.get(url, headers=headers, timeout=10)
            data = r.text.split('"')[1].split(',')
            
            return {
                'name': data[0],
                'open': float(data[1]),
                'close': float(data[3]),
                'high': float(data[4]),
                'low': float(data[5]),
                'volume': int(data[8]),
                'amount': float(data[9]),
                'source': '新浪财经',
                'time': datetime.now().strftime('%H:%M:%S')
            }
        except Exception as e:
            print(f"[WARN] 新浪财经数据获取失败: {e}")
        return None
    
    def get_tushare_basic(self, ts_code):
        """Tushare基础数据"""
        try:
            collector = StockDataCollector()
            return collector.get_price_cross_verify(ts_code)
        except Exception as e:
            print(f"[WARN] Tushare数据获取失败: {e}")
        return None
    
    def get_multi_source_valuation(self, ts_code):
        """多源获取估值数据，交叉验证"""
        sources = []
        
        # 尝试东方财富
        em = self.get_eastmoney_valuation(ts_code)
        if em and em.get('pe'):
            sources.append(em)
            print(f"    ✅ 东方财富: PE={em.get('pe'):.2f}")
        
        # 尝试腾讯财经
        qq = self.get_qq_valuation(ts_code)
        if qq and qq.get('pe'):
            sources.append(qq)
            print(f"    ✅ 腾讯财经: PE={qq.get('pe'):.2f}")
        
        if not sources:
            return None
        
        # 交叉验证：取中位数
        pes = [s['pe'] for s in sources if s.get('pe')]
        pbs = [s['pb'] for s in sources if s.get('pb')]
        
        return {
            'pe': sorted(pes)[len(pes)//2] if pes else None,
            'pb': sorted(pbs)[len(pbs)//2] if pbs else None,
            'sources': [s['source'] for s in sources],
            'raw_data': sources,
            'cross_verified': len(sources) >= 2,
            'time': datetime.now().strftime('%H:%M:%S')
        }
    
    def analyze(self, ts_code, stock_name):
        """执行完整分析"""
        print(f"\n{'='*70}")
        print(f"🔍 开始深度分析: {stock_name}({ts_code})")
        print(f"{'='*70}\n")
        
        # 1. 获取股价数据（长桥为主）
        print("[1/4] 获取实时股价数据...")
        print("    📡 长桥API...")
        lb_data = self.get_longbridge_data(ts_code)
        if lb_data:
            print(f"    ✅ 价格: {lb_data.get('price')}元")
            print(f"       20日涨幅: {lb_data.get('change_20d', 'N/A'):.2f}%" if lb_data.get('change_20d') else "       20日涨幅: N/A")
            self.data['longbridge'] = lb_data
        
        # 2. 多源获取估值数据
        print("\n[2/4] 多源获取估值数据...")
        valuation = self.get_multi_source_valuation(ts_code)
        if valuation:
            print(f"    ✅ 综合PE: {valuation.get('pe'):.2f}倍")
            print(f"    ✅ 综合PB: {valuation.get('pb'):.2f}倍")
            print(f"    📊 数据源: {', '.join(valuation.get('sources', []))}")
            if valuation.get('cross_verified'):
                print(f"    ✓ 交叉验证通过")
            self.data['valuation'] = valuation
        else:
            print("    ⚠️ 估值数据获取失败")
        
        # 3. 获取备选数据源
        print("\n[3/4] 获取备选数据源...")
        print("    📡 新浪财经...")
        sina = self.get_sina_finance(ts_code)
        if sina:
            print(f"    ✅ 新浪价格: {sina.get('close')}元")
            self.data['sina'] = sina
        
        print("    📡 Tushare...")
        ts = self.get_tushare_basic(ts_code)
        if ts:
            print(f"    ✅ Tushare价格: {ts.get('final_price')}元")
            self.data['tushare'] = ts
        
        # 4. 生成报告
        print("\n[4/4] 生成完整报告...")
        report_file = self.generate_report(ts_code, stock_name)
        print(f"    ✅ 报告已保存: {report_file}")
        
        # 输出摘要
        self.print_summary(ts_code, stock_name)
        return report_file
    
    def analyze_short_term(self, ts_code):
        """调用短期预测Skill进行分析"""
        try:
            print(f"  🔄 调用短期预测Skill分析 {ts_code}...")
            st_analyzer = ShortTermAnalyzer()
            result = st_analyzer.analyze(ts_code)
            print(f"  ✅ 短期预测完成: {result['outlook']}")
            return result
        except Exception as e:
            print(f"  ⚠️  短期预测分析失败: {e}")
            return None
    
    def generate_report(self, ts_code, stock_name):
        """生成10环节完整报告"""
        date_str = datetime.now().strftime('%Y%m%d')
        output_file = f"{REPORTS_DIR}/{stock_name}_{ts_code.replace('.', '_')}_深度分析_{date_str}.md"
        os.makedirs(REPORTS_DIR, exist_ok=True)
        
        # 提取数据
        lb = self.data.get('longbridge', {})
        val = self.data.get('valuation', {})
        
        # 调用短期预测Skill
        st_result = self.analyze_short_term(ts_code)
        
        price = lb.get('price', 'N/A')
        total_shares = lb.get('total_shares', 0)
        market_cap = price * total_shares / [REDACTED_PHONE] if isinstance(price, (int, float)) and total_shares else 0
        pe = val.get('pe', 'N/A')
        pb = val.get('pb', 'N/A')
        change_20d = lb.get('change_20d', 'N/A')
        change_5d = lb.get('change_5d', 'N/A')
        change_60d = lb.get('change_60d', 'N/A')
        ma_20 = lb.get('ma_20', 'N/A')
        price_pos = lb.get('price_pos_20', 'N/A')
        sources_str = ', '.join(val.get('sources', ['未知']))
        
        # 格式化字符串
        pe_str = f"{pe:.2f}倍" if isinstance(pe, (int, float)) else 'N/A'
        pb_str = f"{pb:.2f}倍" if isinstance(pb, (int, float)) else 'N/A'
        change_20d_str = f"{change_20d:.2f}%" if isinstance(change_20d, (int, float)) else 'N/A'
        change_60d_str = f"{change_60d:.2f}%" if isinstance(change_60d, (int, float)) else 'N/A'
        ma_20_str = f"{ma_20:.2f}" if isinstance(ma_20, (int, float)) else 'N/A'
        
        # 估值评价
        if isinstance(pe, (int, float)):
            if pe > 80: pe_eval = '🔴 偏高（>80x）'
            elif pe > 50: pe_eval = '🟡 较高（50-80x）'
            elif pe > 30: pe_eval = '🟢 中等（30-50x）'
            else: pe_eval = '🟢 偏低（<30x）'
        else:
            pe_eval = 'N/A'
        
        # 趋势评价
        if isinstance(change_20d, (int, float)):
            if change_20d > 20: trend_eval = '🔴 强势上涨（需警惕）'
            elif change_20d > 10: trend_eval = '🟢 上涨趋势'
            elif change_20d > -10: trend_eval = '🟡 震荡整理'
            else: trend_eval = '🔴 下跌趋势'
        else:
            trend_eval = 'N/A'
        
        # 均线关系
        if isinstance(price, (int, float)) and isinstance(ma_20, (int, float)):
            price_vs_ma = '股价>' if price > ma_20 else '股价<'
        else:
            price_vs_ma = ''
        
        # 交易所
        exchange = '上海证券交易所' if ts_code.endswith('.SH') else '深圳证券交易所'
        
        # 市值评价
        if isinstance(market_cap, (int, float)):
            market_cap_eval = '小盘股' if market_cap < 100 else '中盘股' if market_cap < 500 else '大盘股'
        else:
            market_cap_eval = 'N/A'
        
        # PE行业对比
        if isinstance(pe, (int, float)):
            pe_compare = '高于' if pe > 40 else '接近' if pe > 25 else '低于'
        else:
            pe_compare = 'N/A'
        
        # 5日涨幅
        if isinstance(change_5d, (int, float)):
            change_5d_str = f"{change_5d:.2f}%"
            change_5d_eval = '短期强势' if change_5d > 5 else '短期调整' if change_5d < -5 else '短期震荡'
        else:
            change_5d_str = 'N/A'
            change_5d_eval = 'N/A'
        
        # 价格位置
        if isinstance(price_pos, (int, float)):
            price_pos_str = f"{price_pos:.1f}%"
            price_pos_eval = '高位' if price_pos > 70 else '中位' if price_pos > 30 else '低位'
        else:
            price_pos_str = 'N/A'
            price_pos_eval = 'N/A'
        
        # 估值判断
        if isinstance(pe, (int, float)):
            if pe > 80:
                valuation_judgement = '⚠️ **估值偏高**: 当前PE > 80倍，需业绩高增长支撑，注意回调风险。'
            elif pe > 50:
                valuation_judgement = '⚠️ **估值较高**: 当前PE 50-80倍，处于历史较高分位，需警惕估值回归。'
            elif pe > 30:
                valuation_judgement = '✅ **估值合理**: 当前PE 30-50倍，与成长性匹配。'
            else:
                valuation_judgement = '✅ **估值偏低**: 当前PE < 30倍，具备安全边际。'
        else:
            valuation_judgement = '待补充'
        
        # 综合评级
        if isinstance(pe, (int, float)):
            overall_rating = '🔴 观望' if pe > 80 else '🟡 持有' if pe > 50 else '🟢 关注'
            score_valuation = '⭐⭐' if pe > 60 else '⭐⭐⭐' if pe > 40 else '⭐⭐⭐⭐'
        else:
            overall_rating = '待评估'
            score_valuation = 'N/A'
        
        now_str = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        date_str_short = datetime.now().strftime('%Y年%m月%d日 %H:%M')
        
        # 组装报告
        lines = []
        lines.append(f"# 📊 {stock_name}({ts_code}) 深度分析报告")
        lines.append("")
        lines.append(f"**分析时间**: {date_str_short}")
        lines.append(f"**股票名称**: {stock_name}")
        lines.append(f"**股票代码**: {ts_code}")
        lines.append(f"**分析师**: AI投资助手")
        lines.append("")
        lines.append("---")
        lines.append("")
        lines.append("## 0️⃣ 投资摘要（核心数据一览）")
        lines.append("")
        lines.append("| 指标 | 数值 | 评价 | 数据源 |")
        lines.append("|------|------|------|--------|")
        lines.append(f"| **当前股价** | {price}元 | - | 长桥API |")
        lines.append(f"| **总市值** | {market_cap:.1f}亿元 | - | 计算 |")
        lines.append(f"| **PE(TTM)** | {pe_str} | {pe_eval} | {sources_str} |")
        lines.append(f"| **PB** | {pb_str} | - | 同上 |")
        lines.append(f"| **20日涨幅** | {change_20d_str} | {trend_eval} | 长桥API |")
        lines.append(f"| **60日涨幅** | {change_60d_str} | - | 长桥API |")
        lines.append(f"| **20日均线** | {ma_20_str}元 | {price_vs_ma}均线 | 计算 |")
        lines.append("")
        lines.append("### 💡 一句话总结")
        lines.append("> 待分析师根据完整数据补充...")
        lines.append("")
        lines.append("---")
        lines.append("")
        lines.append("## 1️⃣ 公司基本画像")
        lines.append("")
        lines.append("### 1.1 基本信息")
        lines.append("| 项目 | 内容 |")
        lines.append("|------|------|")
        lines.append(f"| **股票代码** | {ts_code} |")
        lines.append(f"| **公司名称** | {stock_name} |")
        lines.append(f"| **上市市场** | {exchange} |")
        lines.append(f"| **分析时间** | {now_str} |")
        lines.append("")
        lines.append("### 1.2 市值与估值分析")
        lines.append("| 指标 | 数值 | 行业对比 | 评价 |")
        lines.append("|------|------|----------|------|")
        lines.append(f"| **当前股价** | {price}元 | - | - |")
        lines.append(f"| **总市值** | {market_cap:.1f}亿元 | - | {market_cap_eval} |")
        lines.append(f"| **PE(TTM)** | {pe_str} | {pe_compare}行业平均 | {pe_eval} |")
        lines.append("")
        lines.append("### 1.3 技术面速览")
        lines.append("| 指标 | 数值 | 信号 |")
        lines.append("|------|------|------|")
        lines.append(f"| **20日涨幅** | {change_20d_str} | {trend_eval} |")
        lines.append(f"| **5日涨幅** | {change_5d_str} | {change_5d_eval} |")
        lines.append(f"| **价格位置** | {price_pos_str} | {price_pos_eval}（20日内） |")
        lines.append("")
        lines.append("---")
        lines.append("")
        lines.append("## 2️⃣ 业务结构分析")
        lines.append("")
        lines.append("> ⚠️ 本章节需要结合行业研究和公司公告补充")
        lines.append("")
        lines.append("### 2.1 主营业务")
        lines.append("待补充：公司核心业务、产品类型、应用领域...")
        lines.append("")
        lines.append("### 2.2 收入结构")
        lines.append("待补充：分业务/产品收入占比...")
        lines.append("")
        lines.append("### 2.3 核心竞争力")
        lines.append("待补充：技术壁垒、客户认证、市场份额...")
        lines.append("")
        lines.append("---")
        lines.append("")
        lines.append("## 3️⃣ 产业链定位与竞争格局")
        lines.append("")
        lines.append("> ⚠️ 本章节需要结合行业研究补充")
        lines.append("")
        lines.append("### 3.1 产业链位置")
        lines.append("```")
        lines.append("上游: [原材料/设备供应商]")
        lines.append("    ↓")
        lines.append(f"中游: 【{stock_name}】[核心业务]")
        lines.append("    ↓")
        lines.append("下游: [应用领域/客户]")
        lines.append("```")
        lines.append("")
        lines.append("### 3.2 竞争格局")
        lines.append("待补充：主要竞争对手、市场份额、竞争优劣势...")
        lines.append("")
        lines.append("---")
        lines.append("")
        lines.append("## 4️⃣ 订单与产能分析")
        lines.append("")
        lines.append("> ⚠️ 本章节需要跟踪公司公告和行业动态")
        lines.append("")
        lines.append("### 4.1 订单情况")
        lines.append("待补充：在手订单、订单增速、客户结构...")
        lines.append("")
        lines.append("### 4.2 产能布局")
        lines.append("待补充：现有产能、扩产计划、产能利用率...")
        lines.append("")
        lines.append("---")
        lines.append("")
        lines.append("## 5️⃣ 财务深度分析")
        lines.append("")
        lines.append("### 5.1 估值水平分析")
        lines.append("| 指标 | 当前值 | 评价 |")
        lines.append("|------|--------|------|")
        lines.append(f"| PE(TTM) | {pe_str} | {pe_eval} |")
        lines.append(f"| PB | {pb_str} | - |")
        lines.append(f"| 总市值 | {market_cap:.1f}亿元 | - |")
        lines.append("")
        lines.append("### 5.2 估值合理性判断")
        lines.append(valuation_judgement)
        lines.append("")
        lines.append("---")
        lines.append("")
        lines.append("## 6️⃣ 行业景气度验证")
        lines.append("")
        lines.append("> ⚠️ 本章节需要结合宏观经济和行业数据")
        lines.append("")
        lines.append("### 6.1 下游需求景气度")
        lines.append("待补充：主要下游行业景气度...")
        lines.append("")
        lines.append("### 6.2 行业趋势")
        lines.append("待补充：技术趋势、政策环境、竞争格局变化...")
        lines.append("")
        lines.append("---")
        lines.append("")
        lines.append("## 7️⃣ 客户与供应商分析")
        lines.append("")
        lines.append("> ⚠️ 本章节需要结合公司年报和调研信息")
        lines.append("")
        lines.append("### 7.1 客户结构")
        lines.append("待补充：前五大客户、客户集中度、客户质量...")
        lines.append("")
        lines.append("### 7.2 供应商分析")
        lines.append("待补充：原材料来源、供应商议价能力...")
        lines.append("")
        lines.append("---")
        lines.append("")
        lines.append("## 8️⃣ 业绩预测与估值")
        lines.append("")
        lines.append("### 8.1 估值敏感性分析")
        lines.append("基于当前PE进行敏感性分析...")
        lines.append("")
        lines.append("### 8.2 目标价测算")
        lines.append(f"基于当前PE {pe_str}进行目标价测算...")
        lines.append("")
        lines.append("---")
        lines.append("")
        lines.append("## 9️⃣ 风险提示")
        lines.append("")
        lines.append("### 🔴 高风险")
        lines.append("| 风险类型 | 具体表现 | 应对措施 |")
        lines.append("|----------|----------|----------|")
        lines.append(f"| 估值过高 | 当前PE {pe_str}，透支未来增长 | 等待回调至合理区间 |")
        lines.append(f"| 短期过热 | 20日涨幅{change_20d_str}，交易过热 | 控制仓位，分批建仓 |")
        lines.append("")
        lines.append("### 🟡 中风险")
        lines.append("| 风险类型 | 具体表现 | 应对措施 |")
        lines.append("|----------|----------|----------|")
        lines.append("| 业绩不及预期 | 高估值需高增长支撑 | 密切跟踪季报 |")
        lines.append("| 行业竞争加剧 | 可能压缩毛利率 | 关注市场份额变化 |")
        lines.append("")
        lines.append("### 🟢 低风险")
        lines.append("| 风险类型 | 具体表现 | 应对措施 |")
        lines.append("|----------|----------|----------|")
        lines.append("| 市场波动 | 正常市场波动 | 长期持有，忽略短期 |")
        lines.append("")
        lines.append("---")
        lines.append("")
        lines.append("## 🔟 短期技术分析（基于短期预测Skill）")
        lines.append("")
        
        # 添加短期预测结果
        if st_result:
            st_outlook = st_result.get('outlook', 'N/A')
            st_expected = st_result.get('expected_return', 'N/A')
            st_score = st_result.get('score', 0)
            st_support = st_result.get('support', 'N/A')
            st_resistance = st_result.get('resistance', 'N/A')
            st_touch = st_result.get('touch_count', 0)
            st_bounce = st_result.get('bounce_rate', 0)
            st_poc = st_result.get('poc', 'N/A')
            st_patterns = st_result.get('patterns', [])
            st_factors = st_result.get('factors', [])
            
            # 方向emoji
            outlook_emoji = {'强烈看涨': '🚀', '看涨': '📈', '震荡': '➡️', '看跌': '📉', '强烈看跌': '🔻'}
            emoji = outlook_emoji.get(st_outlook, '➡️')
            
            lines.append("### 短期走势预测")
            lines.append("")
            lines.append(f"| 指标 | 数值 | 说明 |")
            lines.append(f"|------|------|------|")
            lines.append(f"| **预测方向** | {emoji} {st_outlook} | 基于多因子模型 |")
            lines.append(f"| **预期收益** | {st_expected} | 未来20日预估 |")
            lines.append(f"| **综合评分** | {st_score:.1f} | 评分越高越看涨 |")
            lines.append("")
            
            lines.append("### 关键技术位")
            lines.append("")
            lines.append(f"| 位置 | 价格 | 有效性 | 说明 |")
            lines.append(f"|------|------|:------:|------|")
            lines.append(f"| **强支撑位** | {st_support:.2f}元 | {'✅' if st_touch >= 3 else '⚠️'} | 触碰{st_touch}次，反弹率{st_bounce:.0%} |")
            lines.append(f"| **强压力位** | {st_resistance:.2f}元 | - | 突破后打开上涨空间 |")
            lines.append(f"| **POC** | {st_poc:.2f}元 | - | 成交量最大价位 |")
            
            # 当前价格位置
            if isinstance(price, (int, float)) and isinstance(st_support, (int, float)) and isinstance(st_resistance, (int, float)):
                range_pct = (price - st_support) / (st_resistance - st_support) * 100
                lines.append(f"| **当前位置** | {range_pct:.1f}% | - | 支撑压力区间位置 |")
            lines.append("")
            
            # 形态识别
            if st_patterns:
                lines.append("### 技术形态识别")
                lines.append("")
                for pattern in st_patterns[-3:]:  # 最近3个形态
                    pattern_emoji = '✅' if pattern in ['W底', '头肩底'] else '⚠️' if pattern in ['M顶', '头肩顶'] else '➡️'
                    lines.append(f"- {pattern_emoji} **{pattern}**")
                lines.append("")
            
            # 评分因素
            if st_factors:
                lines.append("### 评分因素分解")
                lines.append("")
                lines.append("| 因素 | 影响 |")
                lines.append("|------|:----:|")
                for factor in st_factors[:5]:  # 最多显示5个
                    factor_clean = factor.replace('(+', ' | +').replace('(-', ' | -').replace(')', '')
                    lines.append(f"| {factor_clean} |")
                lines.append("")
            
            lines.append("### 买卖点建议")
            lines.append("")
            lines.append("| 类型 | 建议 | 条件 |")
            lines.append("|------|------|------|")
            
            # 买入建议
            if st_score >= 1.5:
                buy_price = st_support * 1.02 if isinstance(st_support, (int, float)) else price * 0.98
                lines.append(f"| **买入点** | 回调至{buy_price:.2f}附近 | 接近强支撑+形态确认 |")
            elif st_score >= 0.5:
                buy_price = st_poc * 0.98 if isinstance(st_poc, (int, float)) else price * 0.97
                lines.append(f"| **买入点** | 突破{st_poc:.2f}并站稳 | 突破POC确认 |")
            else:
                lines.append(f"| **买入点** | 暂不买入 | 等待信号改善 |")
            
            # 止损建议
            stop_price = st_support * 0.97 if isinstance(st_support, (int, float)) else price * 0.95
            lines.append(f"| **止损位** | {stop_price:.2f}元 | 强支撑下方3% |")
            
            # 目标位
            if st_score >= 1:
                target1 = st_resistance * 0.95 if isinstance(st_resistance, (int, float)) else price * 1.08
                target2 = st_resistance if isinstance(st_resistance, (int, float)) else price * 1.15
                lines.append(f"| **目标位1** | {target1:.2f}元 | 接近压力位 |")
                lines.append(f"| **目标位2** | {target2:.2f}元 | 突破压力位 |")
            
            lines.append("")
            
            lines.append("### 风险提示")
            lines.append("")
            if st_score >= 2:
                lines.append("- 🟢 短期技术面偏强，但需关注能否突破压力位")
            elif st_score >= 1:
                lines.append("- 🟡 短期有上涨空间，但需成交量配合")
            elif st_score >= -1:
                lines.append("- ⚠️ 短期震荡为主，方向不明，建议观望")
            else:
                lines.append("- 🔴 短期技术面偏弱，注意下跌风险")
            lines.append(f"- 📊 历史支撑有效性: {st_touch}次测试/{st_bounce:.0%}反弹")
            lines.append("")
        else:
            lines.append("⚠️ 短期预测分析未成功执行")
            lines.append("")
        
        lines.append("---")
        lines.append("")
        lines.append("## 🔟 投资建议")
        lines.append("")
        lines.append("### 10.1 投资逻辑评分")
        lines.append("| 维度 | 评分 | 说明 |")
        lines.append("|------|:----:|------|")
        lines.append("| 行业景气度 | ⭐⭐⭐⭐⭐ | 待补充 |")
        lines.append("| 业绩成长性 | ⭐⭐⭐⭐ | 待补充 |")
        lines.append(f"| 估值合理性 | {score_valuation} | PE {pe_str} |")
        lines.append(f"| 技术趋势 | ⭐⭐⭐⭐ | 20日涨幅{change_20d_str} |")
        lines.append("")
        lines.append("### 10.2 投资建议")
        lines.append("| 建议项 | 内容 |")
        lines.append("|--------|------|")
        lines.append(f"| **综合评级** | {overall_rating}（基于估值） |")
        lines.append(f"| **当前状态** | 股价{price}元，PE {pe_str}，20日{trend_eval} |")
        lines.append(f"| **估值判断** | {pe_eval} |")
        lines.append("| **止损位** | 建议设置在20日均线以下5-10% |")
        lines.append("")
        lines.append("### 10.3 关键跟踪指标")
        lines.append("| 指标 | 频率 | 关注重点 |")
        lines.append("|------|------|----------|")
        lines.append("| 季度净利润增速 | 季度 | 是否维持高增长 |")
        lines.append("| PE估值 | 日度 | 是否回归合理区间 |")
        lines.append("| 20日均线 | 日度 | 技术支撑/压力 |")
        lines.append("| 行业订单 | 不定期 | 下游需求变化 |")
        lines.append("")
        lines.append("---")
        lines.append("")
        lines.append("## 📎 附：数据源说明")
        lines.append("")
        lines.append("| 数据类型 | 主要来源 | 备选来源 | 交叉验证 |")
        lines.append("|----------|----------|----------|----------|")
        lines.append("| 实时股价 | 长桥API | 新浪财经、Tushare | ✅ 已执行 |")
        lines.append("| 估值数据(PE/PB) | 东方财富 | 腾讯财经 | ✅ 已执行 |")
        lines.append("| 股本数据 | 长桥API | - | - |")
        lines.append("| K线数据 | 长桥API | - | - |")
        lines.append("| 市值计算 | 实时计算 | - | - |")
        lines.append("")
        lines.append(f"**数据时效**: 本报告数据获取时间为 {now_str}")
        lines.append("**免责声明**: 本报告仅供参考，不构成投资建议。股市有风险，投资需谨慎。")
        lines.append("")
        lines.append("---")
        lines.append("")
        lines.append(f"*报告生成时间: {now_str}*")
        lines.append("*报告状态: ✅ 基础数据框架完成，部分章节需人工补充行业研究*")
        
        # 写入文件
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write('\n'.join(lines))
        
        return output_file
    
    def print_summary(self, ts_code, stock_name):
        """打印分析摘要"""
        lb = self.data.get('longbridge', {})
        val = self.data.get('valuation', {})
        
        price = lb.get('price', 'N/A')
        pe = val.get('pe', 'N/A')
        change_20d = lb.get('change_20d', 'N/A')
        
        print(f"\n{'='*70}")
        print("📊 分析摘要")
        print(f"{'='*70}")
        print(f"股票: {stock_name}({ts_code})")
        print(f"价格: {price}元" if price != 'N/A' else "价格: 获取失败")
        print(f"PE: {pe:.2f}倍" if isinstance(pe, (int, float)) else "PE: 获取失败")
        print(f"20日涨幅: {change_20d:.2f}%" if isinstance(change_20d, (int, float)) else "20日涨幅: N/A")
        if val.get('cross_verified'):
            print(f"✓ 估值数据交叉验证通过")
        print(f"{'='*70}\n")


def main():
    parser = argparse.ArgumentParser(description='A股个股深度分析工具 - 全实时数据源')
    parser.add_argument('--code', required=True, help='股票代码 (如: 300570, 600875)')
    parser.add_argument('--name', required=True, help='股票名称 (如: 太辰光)')
    parser.add_argument('--output', default=REPORTS_DIR, help=f'输出目录 (默认: {REPORTS_DIR})')
    
    args = parser.parse_args()
    
    # 自动补全代码后缀
    ts_code = args.code
    if '.' not in ts_code:
        if ts_code.startswith('6'):
            ts_code += '.SH'
        else:
            ts_code += '.SZ'
    
    analyzer = StockAnalyzer()
    analyzer.analyze(ts_code, args.name)


if __name__ == '__main__':
    main()