#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
ota_download.py - 贺简云物联 IoT 设备 OTA 固件下载示例（Python）

流程（与平台 §3「设备 OTA 固件下载」一致）：
  1. 调用 command 拉取指令（取走即 sent）；
  2. 在返回的 commands 中查找 type=ota 的指令，其 payload 固定为：
     {"version":"1.2.0","job_id":"<id>","size":123456,"sha256":"<hex>","ts":...}
  3. 取 payload.job_id 调用 dev.ota_download(job_id, dest_path) 下载固件；
  4. 下载完成后按响应头 X-OTA-SHA256 校验，返回版本 / 大小 / 校验结果。

前置：
  * 平台已完成「上传 → 审查 → 编译 → 推送」，且推送时间在 24 小时窗口内；
  * 设备凭据有效，且租户 OTA 功能未被停用、云盘未被封禁。

运行：
  python3 ota_download.py            # 仅演示：拉指令并下载命中的 OTA 固件

安全提醒：真实 device_token 请勿提交到公开仓库。
"""

import sys
from pathlib import Path

# 允许直接在本目录运行：优先从上级目录导入 hjyiot.py
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from hjyiot import HjyIotDevice, HjyIotError  # noqa: E402

BASE_URL = "https://www.hjyiot.cn/api.php"
DEVICE_ID = "<your_device_id>"
DEVICE_TOKEN = "<your_device_token>"
DEST_PATH = "./firmware.bin"        # 固件落盘路径


def main() -> None:
    # device_token 为占位符时给出提醒，避免直接连生产误操作
    if DEVICE_TOKEN.startswith("<"):
        print("提示：请先在脚本顶部填入真实的 DEVICE_ID / DEVICE_TOKEN。")
        return

    dev = HjyIotDevice(BASE_URL, DEVICE_ID, DEVICE_TOKEN)

    # 1) 拉取待执行指令
    try:
        data = dev.pull_commands()
    except HjyIotError as exc:
        print(f"拉取指令失败：{exc}")
        return

    commands = (data or {}).get("commands") or []
    ota_cmd = next((c for c in commands if c.get("type") == "ota"), None)
    if ota_cmd is None:
        print(f"本次未拉到 OTA 指令（共 {len(commands)} 条指令）。")
        return

    payload = ota_cmd.get("payload") or {}
    job_id = payload.get("job_id")
    version = payload.get("version")
    print(f"命中 OTA 指令：version={version} job_id={job_id} "
          f"source={ota_cmd.get('source')}")

    # 2) 下载固件并按 X-OTA-SHA256 校验
    try:
        result = dev.ota_download(job_id, DEST_PATH)
    except HjyIotError as exc:
        # 常见错误：1002 功能停用/云盘封禁/已冻结、1003 任务不存在、
        #          1004 缺少 job_id/未就绪/窗口过期、1006 固件缺失
        print(f"OTA 下载失败：{exc}")
        return

    print("下载完成：")
    print(f"  version     = {result['version']}")
    print(f"  size        = {result['size']} 字节"
          f"（响应头 X-OTA-Size={result['size_header']}）")
    print(f"  sha256      = {result['sha256']}")
    print(f"  校验一致    = {result['sha256_match']}")
    print(f"  保存路径    = {result['path']}")

    if not result["sha256_match"]:
        print("警告：SHA-256 与平台响应头不一致，固件可能不完整，请勿刷入！")


if __name__ == "__main__":
    main()
