# frozen_string_literal: true

# 脚本相关路由
module ScriptRoutes
  def self.registered(app)
    # 获取脚本列表 API
    app.get '/api/v1/scripts' do
      content_type :json
      begin
        scripts = CachedScript.order(Sequel.desc(:updated_at)).all
        scripts.map(&:to_api_hash).to_json
      rescue StandardError => e
        LogService.error("获取脚本列表失败: #{e.message}")
        status 500
        { success: false, error: e.message }.to_json
      end
    end

    # 获取单个脚本详情 API
    app.get '/api/v1/scripts/:id' do
      content_type :json
      begin
        script = CachedScript[id: params[:id]]
        halt 404, { success: false, error: '脚本不存在' }.to_json unless script
        script.to_api_hash.to_json
      rescue StandardError => e
        LogService.error("获取脚本详情失败: #{e.message}")
        status 500
        { success: false, error: e.message }.to_json
      end
    end

    # 同步脚本 API
    app.post '/api/v1/scripts/sync' do
      content_type :json
      begin
        LogService.debug("[脚本同步] ========== 开始同步脚本 ==========")
        
        cloud_client = CloudClient.instance
        
        # 获取上次同步时间
        last_sync_setting = SystemSetting.find_or_create(key: 'last_script_sync_time')
        since = last_sync_setting.value
        
        LogService.info("开始同步脚本，上次同步时间: #{since}")
        LogService.debug("[脚本同步] 上次同步时间设置: #{since.inspect}")
        LogService.debug("[脚本同步] 当前时间: #{Time.now.iso8601}")
        
        # 从云端获取脚本
        LogService.debug("[脚本同步] 调用 cloud_client.get_scripts_for_sync...")
        cloud_scripts = cloud_client.get_scripts_for_sync(since: since)
        
        LogService.debug("[脚本同步] 从云端获取到 #{cloud_scripts.size} 个脚本")
        LogService.debug("[脚本同步] 脚本列表: #{cloud_scripts.map { |s| { id: s['id'], name: s['name'] } }.inspect}")
        
        created_count = 0
        updated_count = 0
        failed_count = 0
        
        # 处理每个脚本
        cloud_scripts.each_with_index do |cloud_script, idx|
          begin
            LogService.debug("[脚本同步] 处理脚本 #{idx + 1}/#{cloud_scripts.size}: id=#{cloud_script['id']}, name=#{cloud_script['name']}")
            
            existing = CachedScript[id: cloud_script['id']]
            LogService.debug("[脚本同步] 脚本 #{cloud_script['id']} 是否已存在: #{!existing.nil?}")
            
            if existing
              LogService.debug("[脚本同步] 现有脚本数据: version=#{existing.version}, updated_at=#{existing.updated_at}")
            end
            
            result = CachedScript.create_or_update_from_cloud(cloud_script)
            LogService.debug("[脚本同步] 脚本 #{cloud_script['id']} 保存结果: #{result.saved? ? '成功' : '失败'}")
            
            if existing
              updated_count += 1
              LogService.debug("[脚本同步] 更新脚本: #{cloud_script['id']} - #{cloud_script['name']}")
            else
              created_count += 1
              LogService.debug("[脚本同步] 创建脚本: #{cloud_script['id']} - #{cloud_script['name']}")
            end
          rescue StandardError => e
            LogService.error("同步脚本失败 #{cloud_script['id']}: #{e.message}")
            LogService.debug('[脚本同步] 脚本 ' + cloud_script['id'].to_s + ' 异常堆栈: ' + e.backtrace.join("\n"))
            failed_count += 1
          end
        end
        
        # 更新同步时间
        new_sync_time = Time.now.iso8601
        last_sync_setting.update(value: new_sync_time)
        LogService.debug("[脚本同步] 更新同步时间为: #{new_sync_time}")
        
        LogService.info("脚本同步完成: 新增 #{created_count}, 更新 #{updated_count}, 失败 #{failed_count}")
        LogService.debug("[脚本同步] 当前缓存脚本总数: #{CachedScript.count}")
        LogService.debug("[脚本同步] ========== 同步脚本结束 ==========")
        
        {
          success: true,
          synced: created_count + updated_count,
          created: created_count,
          updated: updated_count,
          failed: failed_count
        }.to_json
      rescue StandardError => e
        LogService.error("同步脚本失败: #{e.message}")
        LogService.debug('[脚本同步] 全局异常堆栈: ' + e.backtrace.join("\n"))
        LogService.debug("[脚本同步] ========== 同步脚本异常结束 ==========")
        status 500
        { success: false, error: e.message }.to_json
      end
    end

    # 获取同步状态 API
    app.get '/api/v1/scripts/sync/status' do
      content_type :json
      begin
        last_sync_setting = SystemSetting[key: 'last_script_sync_time']
        
        {
          success: true,
          data: {
            last_sync_time: last_sync_setting&.value,
            total_scripts: CachedScript.count
          }
        }.to_json
      rescue StandardError => e
        LogService.error("获取同步状态失败: #{e.message}")
        status 500
        { success: false, error: e.message }.to_json
      end
    end
  end
end
