"""
初始化文档管理命令

加载默认文档到数据库。
"""

from django.core.management.base import BaseCommand

from apps.account.infrastructure.models import DocumentationModel


class Command(BaseCommand):
    help = '初始化系统文档'

    def handle(self, *args, **options):
        # 初始文档数据
        initial_docs = [
            {
                'title': '投资信号与持仓关系',
                'slug': 'signal-and-position',
                'category': 'concept',
                'order': 1,
                'summary': '说明 AgomTradePro 中投资信号和持仓的关系，以及系统的工作流程',
                'content': '''# 投资信号与持仓关系说明

## 概述

AgomTradePro 是一个**决策辅助系统**，不是自动交易系统。系统负责分析宏观环境并给出投资建议，用户根据建议**手动执行交易**。

## 核心概念

### 投资信号 (InvestmentSignal)

**投资信号是系统根据宏观分析生成的交易建议。**

- **生成时机**：当 Regime 判定、宏观指标变化等条件满足时
- **信号内容**：
  - `asset_code` - 建议交易的资产代码
  - `direction` - 建议方向（Long 做多 / Short 做空）
  - `logic_desc` - 信号逻辑说明
  - `invalidation_logic` - 证伪条件（什么情况下信号失效）

- **信号状态**：
  - `pending` - 待审核
  - `approved` - 已采纳（用户认可该建议）
  - `rejected` - 已拒绝（用户不认可）

- **示例信号**：
  ```
  PMI 连续回升，经济复苏 → 建议买入沪深300 (000300.SH)
  证伪条件：PMI 跌破 50 且连续 2 月低于前值
  ```

### 持仓 (Position)

**持仓是用户实际持有并手动录入的资产记录。**

- **记录内容**：
  - `asset_code` - 资产代码
  - `shares` - 持仓数量
  - `avg_cost` - 平均成本价
  - `current_price` - 当前市价
  - `market_value` - 市值 = shares × current_price

- **来源追踪**：
  - `source = 'manual'` - 手动录入（与信号无关）
  - `source = 'signal'` - 从信号创建（关联 signal_id）
  - `source = 'backtest'` - 从回测创建

- **状态**：
  - `is_closed = False` - 持仓中
  - `is_closed = True` - 已平仓

## 信号 → 持仓 的流程

### 当前系统流程（手动交易模式）

```
┌─────────────────────────────────────────────────────────────────────┐
│                        宏观环境分析                                   │
│  Regime 判定 → PMI/CPI 数据 → 增长/通胀动量 → 当前象限               │
└─────────────────────────────────────────────────────────────────────┘
                                  │
                                  ▼
┌─────────────────────────────────────────────────────────────────────┐
│                        生成投资建议                                   │
│  系统根据宏观环境生成投资信号（如：建议买入沪深300）                  │
└─────────────────────────────────────────────────────────────────────┘
                                  │
                    ┌─────────────┴─────────────┐
                    ▼                           ▼
            ┌───────────────┐           ┌───────────────┐
            │  用户采纳建议  │           │  用户拒绝建议  │
            │  approved     │           │  rejected     │
            └───────────────┘           └───────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────────────────────────────┐
│                        用户手动执行交易                               │
│  用户在券商 APP/软件中实际买入资产                                   │
└─────────────────────────────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────────────────────────────┐
│                        录入持仓到系统                                 │
│  用户在系统中手动记录持仓信息（数量、成本价等）                       │
│  可选择关联到对应信号（source = signal, source_id = 信号ID）          │
└─────────────────────────────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────────────────────────────┐
│                        系统持续监控                                   │
│  • 更新持仓市值（需要行情接口）                                       │
│  • 监控证伪条件（信号失效时提示平仓）                                 │
│  • 分析持仓与当前 Regime 的匹配度                                     │
└─────────────────────────────────────────────────────────────────────┘
```

## 关键区别

| 维度 | 投资信号 | 持仓 |
|------|---------|------|
| **性质** | 建议/计划 | 实际持有 |
| **生成方** | 系统自动分析 | 用户手动录入 |
| **时效性** | 执行前存在 | 执行后产生 |
| **变更** | 状态可变（pending→approved/rejected） | 数量可增减，可平仓 |
| **证伪** | 有证伪条件，失效后提示 | 监控对应信号的证伪条件 |

## 证伪逻辑

当信号的 `invalidation_logic` 被触发时：

1. **系统检测**：定时任务检查活跃信号的证伪条件
2. **状态更新**：信号状态变为 `invalidated`
3. **用户通知**：系统提示用户考虑平仓
4. **用户决策**：用户决定是否平仓（手动执行）
5. **持仓更新**：用户在系统中记录平仓操作

## 示例场景

### 场景 1：信号 → 采纳 → 建仓 → 持仓

```
1. 系统分析：PMI 从 49 回升到 51，连续 3 个月上涨
2. 生成信号：建议买入 000300.SH（沪深300）
   逻辑：经济复苏，权益资产受益
   证伪：PMI 跌破 50 且连续 2 月低于前值
3. 用户审核：采纳该建议 (approved)
4. 用户操作：在券商 APP 买入 1000 股，成本价 4.5 元
5. 录入持仓：
   - asset_code: 000300.SH
   - shares: 1000
   - avg_cost: 4.5
   - source: signal
   - source_id: 信号ID
6. 系统监控：
   - 持续跟踪 PMI 数据
   - 如果 PMI 跌破 50，系统提示"建议平仓"
```

### 场景 2：手动建仓（与信号无关）

```
1. 用户自主决定买入某资产
2. 在券商 APP 完成交易
3. 录入持仓：
   - asset_code: 512100.SH
   - shares: 500
   - avg_cost: 10.2
   - source: manual
4. 系统分析：该持仓与当前 Regime 匹配度低，给出调整建议
```

## 系统边界

### 系统负责 ✅

- 宏观环境分析（Regime 判定）
- 生成投资建议（信号）
- 监控证伪条件
- 分析持仓匹配度
- 提供调整建议

### 用户负责 ✅

- 审核信号（采纳/拒绝）
- 手动执行交易（通过券商）
- 录入持仓信息
- 更新持仓价格
- 决定平仓时机

### 系统不负责 ❌

- 自动交易
- 资金划转
- 实时行情（需配置外部接口）
- 订单执行

## 用户操作指南

### 查看信号

1. 进入 `/signal/manage/`
2. 查看所有信号的状态
3. 点击信号查看详细逻辑

### 采纳/拒绝信号

1. 在信号列表中，点击"采纳"或"拒绝"
2. 采纳后，信号变为 `approved` 状态
3. 系统记录您的决策

### 手动建仓

**方式 1：从信号创建**
1. 在信号详情页，点击"创建持仓"
2. 填写持仓信息（数量、成本价）
3. 提交后自动关联到该信号

**方式 2：手动录入**
1. 进入持仓管理页面
2. 点击"添加持仓"
3. 填写持仓信息，来源选择"手动"

### 更新持仓价格

1. 进入持仓列表
2. 点击"更新价格"（需要配置行情接口）
3. 系统自动重算市值和盈亏

### 平仓

1. 在持仓列表中，点击"平仓"
2. 输入平仓数量和价格
3. 系统记录平仓操作

## 数据模型关系

```
InvestmentSignal (投资信号)
    ├─ id
    ├─ asset_code
    ├─ direction (Long/Short)
    ├─ logic_desc
    ├─ invalidation_logic
    └─ status (pending/approved/rejected/invalidated)

Position (持仓)
    ├─ id
    ├─ asset_code
    ├─ shares
    ├─ avg_cost
    ├─ source (manual/signal/backtest)
    ├─ source_id (关联的 signal_id 或 backtest_id)
    └─ is_closed

PositionSignalLog (信号执行日志) [可选]
    ├─ signal_id
    ├─ position_id
    └─ executed_at
```

## 未来扩展

### 自动交易模式（未来可能）

如果对接券商 API，可以实现：

1. 系统生成信号 → 自动发送订单到券商
2. 信号证伪 → 自动发送平仓订单
3. 每日收盘自动更新持仓市值

但这需要：
- 券商 API 接入
- 资金账户授权
- 风控机制
- 监管合规

---

## 总结

> **AgomTradePro 是您的投资决策助手，不是自动交易机器人。**
>
> 系统帮您分析宏观环境、生成投资建议、监控风险，但最终决策和执行由您掌控。
'''
            },
            {
                'title': 'Regime 投资象限说明',
                'slug': 'regime-guide',
                'category': 'concept',
                'order': 2,
                'summary': 'Regime 框架四个象限的含义和对应的投资策略',
                'content': '''# Regime 投资象限说明

## 什么是 Regime 框架

Regime 框架通过**增长**和**通胀**两个维度，将宏观经济环境划分为四个象限。不同的象限对应不同的最优投资策略。

## 四个象限

### 1. 复苏 (Recovery)

**特征**：增长 ↑ 通胀 ↓

- PMI 连续上升，消费和投资回暖
- CPI 保持低位或温和
- 央行政策偏向宽松

**最优策略**：
- **增加权益仓位**（建议 70%+）
- 重点关注**成长股**和**周期股**
- 行业配置：科技、消费、新能源、材料

**典型资产**：
- 沪深300、中证500
- 成长型基金
- 科技 ETF

---

### 2. 过热 (Overheat)

**特征**：增长 ↑ 通胀 ↑

- 经济强劲，但通胀压力上升
- PMI 高位运行
- 央行可能收紧货币政策

**最优策略**：
- **增加商品配置**
- 关注**通胀对冲**资产
- 降低**长久期债券**仓位
- 保持权益仓位适中

**典型资产**：
- 商品 ETF（黄金、原油）
- 短债
- 防御性股票（公用事业、必需消费）

---

### 3. 滞胀 (Stagflation)

**特征**：增长 ↓ 通胀 ↑

- 经济放缓，但通胀居高不下
- 最具挑战性的宏观环境
- 现金和短债为王

**最优策略**：
- **增加现金和短债**
- 关注**防御股**和**黄金**
- 降低风险资产配置

**典型资产**：
- 货币基金
- 短期国债
- 黄金
- 公用事业、医疗等防御板块

---

### 4. 通缩 (Deflation)

**特征**：增长 ↓ 通胀 ↓

- 经济衰退，需求疲软
- CPI 持续下行
- 央行放松货币政策

**最优策略**：
- **增加长久期国债**
- **降低权益仓位**
- 保持充足现金流
- 等待复苏信号

**典型资产**：
- 长期国债
- 高等级债券
- 现金
- 避免高波动股票

---

## Regime 切换信号

### 复苏 → 过热
- **信号**：CPI 连续 3 个月上升超过 3%
- **操作**：减配成长股，增加商品配置

### 过热 → 滞胀
- **信号**：PMI 跌破 50 且 CPI > 3%
- **操作**：大幅降低权益仓位，增加现金

### 滞胀 → 通缩
- **信号**：CPI 连续 3 个月下行至 2% 以下
- **操作**：增加长久期债券

### 通缩 → 复苏
- **信号**：PMI 连续 3 个月上升且突破 50
- **操作**：增加权益仓位，重点关注周期股

## 系统如何判断 Regime

1. **数据采集**：每月获取 PMI、CPI 官方数据
2. **动量计算**：计算增长和通胀的 z-score 动量
3. **象限判定**：根据动量正负确定当前象限
4. **置信度评估**：结合历史数据评估判断可靠性

## 注意事项

1. **Regime 切换有滞后性**：经济数据通常滞后 1-2 个月
2. **边界区域**：当指标接近临界值时，象限可能模糊
3. **个性化调整**：根据个人风险偏好调整建议仓位
4. **持续监控**：每月更新数据，关注象限变化

---

## 总结

Regime 框架的核心思想是：**在不同的宏观环境下，不同的资产表现差异巨大**。通过识别当前环境并调整配置，可以获得更稳定的长期收益。
'''
            },
            {
                'title': '用户操作指南',
                'slug': 'user-guide',
                'category': 'user_guide',
                'order': 3,
                'summary': '系统各功能模块的使用说明',
                'content': '''# 用户操作指南

## 快速开始

### 1. 注册登录

访问 `/account/register/` 创建账户，使用用户名和密码登录。

### 2. 完善账户设置

进入 `/account/settings/`：
- 设置显示名称
- 选择风险偏好（保守/稳健/激进）
- 记录初始资金（入金）

### 3. 查看仪表盘

访问 `/dashboard/` 查看：
- 当前 Regime 象限
- 账户总资产
- 持仓情况
- 投资建议

---

## 核心功能

### 宏观环境分析

**访问路径**：`/regime/dashboard/`

**功能**：
- 查看当前 Regime 象限
- 查看 PMI、CPI 历史走势
- 了解增长/通胀动量
- 查看 Regime 概率分布

---

### 投资信号管理

**访问路径**：`/signal/manage/`

**功能**：
- 查看系统生成的投资信号
- 审核信号（采纳/拒绝）
- 查看信号逻辑和证伪条件
- 从信号创建持仓

**操作步骤**：
1. 查看信号列表和详情
2. 根据信号逻辑判断是否采纳
3. 点击"采纳"或"拒绝"按钮
4. 如果采纳，可以在券商 APP 执行交易后，在系统中记录持仓

---

### 持仓管理

**访问路径**：`/account/profile/#positions`

**功能**：
- 查看当前持仓
- 手动添加持仓
- 更新持仓价格
- 平仓操作

**添加持仓**：
1. 点击"添加持仓"
2. 填写资产代码、数量、成本价
3. 选择来源（手动/信号）
4. 保存

**更新价格**：
1. 点击"更新价格"按钮
2. 系统会调用行情接口（需配置）
3. 自动重算市值和盈亏

---

### 回测引擎

**访问路径**：`/backtest/`

**功能**：
- 基于历史数据回测投资策略
- 评估不同 Regime 下的策略表现
- 应用回测结果到实际持仓

**使用步骤**：
1. 选择回测时间范围
2. 选择回测策略（如：跟随 Regime）
3. 运行回测
4. 查看收益率、最大回撤等指标
5. 点击"应用到实际持仓"生成建议配置

---

### 资金管理

**访问路径**：`/account/settings/`

**功能**：
- 记录入金/出金
- 查看资金流水
- 查看净投入

**操作**：
1. 点击"+ 入金"或"- 出金"按钮
2. 填写金额、日期、备注
3. 保存

---

## 常见问题

### Q: 系统会自动交易吗？

**A**: 不会。AgomTradePro 是决策辅助系统，只提供建议。您需要：
1. 在系统中查看建议
2. 在券商 APP 手动执行交易
3. 在系统中记录持仓

### Q: 为什么需要手动录入持仓？

**A**: 因为系统不直接连接您的券商账户。手动录入可以：
- 保护您的账户安全
- 支持多个券商账户
- 灵活记录实际交易情况

### Q: 投资信号多久更新一次？

**A**: 系统每月获取新的宏观数据（PMI、CPI）后自动更新。您也可以在"宏观数据"页面手动触发数据更新。

### Q: 如何修改风险偏好？

**A**: 在 `/account/settings/` 页面修改风险偏好，系统会根据新偏好调整建议。

### Q: 忘记密码怎么办？

**A**: 目前系统不支持密码找回，请联系管理员重置。

---

## 最佳实践

1. **每月查看一次** Regime 象限变化
2. **关注证伪条件**，当信号失效时及时调整
3. **记录所有交易**，保持持仓数据准确
4. **定期复盘**，查看投资建议是否准确
5. **结合自身判断**，系统建议仅供参考

---

## 联系支持

如有问题，请通过以下方式联系：
- 系统管理员：admin@agomtradepro.com
- GitHub Issues：https://github.com/your-repo/issues
'''
            },
        ]

        created_count = 0
        updated_count = 0

        for doc_data in initial_docs:
            # 检查是否已存在同 slug 文档
            existing = DocumentationModel._default_manager.filter(slug=doc_data['slug']).first()

            if existing:
                # 更新现有文档
                for key, value in doc_data.items():
                    setattr(existing, key, value)
                existing.save()
                updated_count += 1
                self.stdout.write(f'[更新] {doc_data["title"]}')
            else:
                # 创建新文档
                DocumentationModel._default_manager.create(**doc_data)
                created_count += 1
                self.stdout.write(f'[创建] {doc_data["title"]}')

        self.stdout.write(self.style.SUCCESS(f'\n初始化完成！创建 {created_count} 篇文档，更新 {updated_count} 篇文档。'))

