-- 1. 重建定时任务表 (增加 python_code 支持动态逻辑)
DROP TABLE IF EXISTS "public"."scheduled_jobs" CASCADE;

CREATE TABLE "public"."scheduled_jobs" (
  "id" SERIAL PRIMARY KEY,
  "name" VARCHAR(100) NOT NULL,             -- 任务名称
  "cron_expression" VARCHAR(50) NOT NULL,   -- CRON表达式
  "python_code" TEXT,                       -- 【核心】可执行的Python业务代码
  "is_active" BOOLEAN DEFAULT TRUE,         -- 启停状态
  "last_run_at" TIMESTAMP,                  -- 上次执行时间
  "last_run_status" VARCHAR(20),            -- 上次执行结果
  "next_run_at" TIMESTAMP,                  -- 下次预计执行时间
  "description" TEXT,                       -- 描述
  "created_at" TIMESTAMP DEFAULT NOW(),
  "updated_at" TIMESTAMP DEFAULT NOW()
);

-- 索引
CREATE INDEX "idx_scheduled_jobs_active" ON "public"."scheduled_jobs" ("is_active");

-- 注释
COMMENT ON TABLE "public"."scheduled_jobs" IS '定时任务调度配置表（支持动态Python代码）';
COMMENT ON COLUMN "public"."scheduled_jobs"."python_code" IS '直接执行的Python代码体，上下文中可使用 db, logger 等变量';

-- 插入默认任务：每日同步位置
INSERT INTO "public"."scheduled_jobs" 
("name", "cron_expression", "description", "is_active", "python_code") 
VALUES 
(
    '每日全量位置同步', 
    '0 0 * * *', 
    '每天UTC 0点同步所有活跃天体的最新位置数据', 
    true,
    '# 这是一个动态任务示例
# 可用变量: db (AsyncSession), logger (Logger)
from app.services.db_service import celestial_body_service, position_service
from app.services.horizons import horizons_service
from datetime import datetime

logger.info("开始执行每日位置同步...")

# 获取所有活跃天体
bodies = await celestial_body_service.get_all_bodies(db)
active_bodies = [b for b in bodies if b.is_active]

count = 0
now = datetime.utcnow()

for body in active_bodies:
    try:
        # 获取当天位置
        positions = await horizons_service.get_body_positions(
            body_id=body.id,
            start_time=now,
            end_time=now
        )
        
        if positions:
            # 这里的 save_positions 需要自己实现或确保 db_service 中有对应方法支持 list
            # 假设我们循环 save_position 或者 db_service 已有批量接口
            # 为简单起见，这里演示循环调用
            for p in positions:
                await position_service.save_position(
                    body_id=body.id,
                    time=p.time,
                    x=p.x,
                    y=p.y,
                    z=p.z,
                    source="nasa_horizons_cron",
                    session=db
                )
            count += 1
    except Exception as e:
        logger.error(f"同步 {body.name} 失败: {e}")

logger.info(f"同步完成，共更新 {count} 个天体")
# 脚本最后一行表达式的值会被作为 result 存储
f"Synced {count} bodies"
'
);
