/**
 * ============================================================
 * pipeline.ts — 主流程编排模块
 * ============================================================
 * 功能：
 *   整个数据处理管道的入口，按以下顺序执行：
 *   1. 解析 CSV → RawCsvRow[]
 *   2. 对每行调用 LLM 分析 → ParsedProduct[]
 *   3. 构建关键词输入行 + 搜索计划行
 *   4. （可选）写入 Supabase
 * 
 * 提供两种模式：
 *   - processCsvBuffer()  — 完整管道（含 Supabase 写入）
 *   - processCsvDryRun()  — 干跑模式（不写入数据库，返回行数据供预览）
 * ============================================================
 */

import { parseCsvBuffer } from "../core/csv-parser.ts";
import { analyzeProduct } from "../standardization/standardization-llm.ts";
import { buildAllRows } from "../keywords/keyword-generator.ts";
import type {
  RawCsvRow,
  ParsedProduct,
  KeywordInputRow,
  SearchPlanRow,
  PipelineResult,
} from "../core/types.ts";

// ── 日志辅助函数 ─────────────────────────────────────────────
function log(msg: string) {
  console.log(`[pipeline] ${msg}`);
}

/**
 * 对一批 RawCsvRow 调用 LLM 逐行分析，返回 ParsedProduct[]
 * @param rows     - CSV 解析出的原始行
 * @param startId  - 起始序号（默认 1）
 * @param limit    - 只处理前 N 行（undefined = 全部）
 */
export async function analyzeRows(
  rows: RawCsvRow[],
  startId: number = 1,
  limit?: number,
): Promise<ParsedProduct[]> {
  const products: ParsedProduct[] = [];
  const toProcess = limit ? rows.slice(0, limit) : rows;

  for (let i = 0; i < toProcess.length; i++) {
    const raw = toProcess[i]!;
    const sequence = startId + i;

    log(`正在分析第 ${sequence} 行: ${raw.名称} ...`);

    // 调用 LLM 提取结构化信息
    const analysis = await analyzeProduct(raw);

    log(
      `  → 材质: ${analysis.material} | 用途: ${analysis.usage} | 规格: ${analysis.simplified_spec}`,
    );
    log(
      `  → 品牌简称: ${analysis.brand_term || "(无)"} | 修饰词: ${analysis.modifier_terms.join(" / ") || "(无)"} | AI替代词: ${analysis.alternative_terms.join(" / ") || "(无)"}`,
    );

    products.push({ material_id: `csv-row-${sequence}`, raw, analysis });
  }

  return products;
}

/**
 * 干跑模式：解析 CSV + LLM 分析 + 构建表行，但不写入 Supabase
 * 用于测试和预览
 * @param rows   - CSV 原始行
 * @param limit  - 只处理前 N 行
 * @returns 两类预览行数据（可 JSON 输出到文件供预览）
 */
export async function processDryRun(
  rows: RawCsvRow[],
  limit?: number,
  batchId: string = '',
): Promise<{
  keywordInputRows: Omit<KeywordInputRow, "id" | "created_at">[];
  searchPlanRows: Omit<SearchPlanRow, "id" | "created_at">[];
}> {
  // 第1步：LLM 逐行分析
  const products = await analyzeRows(rows, 1, limit);

  // 第2步：构建两类预览行数据
  const { keywordInputRows, searchPlanRows } = buildAllRows(products, batchId);

  log(`干跑完成: 关键词输入 ${keywordInputRows.length} 行, 搜索计划 ${searchPlanRows.length} 行`);

  return { keywordInputRows, searchPlanRows };
}

/**
 * 完整流水线：解析 + LLM 分析 + 构建行 + 写入 Supabase
 * @param buffer  - CSV 文件 Buffer
 * @param options - { append: true=追加, false=先删旧数据再写入 }
 * @returns PipelineResult
 */
export async function processCsvBuffer(
  buffer: Buffer,
  _options: { append: boolean; batchId?: string } = { append: true },
): Promise<PipelineResult> {
  const rawRows = parseCsvBuffer(buffer);
  const message = "旧 CSV 直写关键词输入/搜索计划流程已弃用，请改用 procurement_materials/source_files 主流程。";

  log(message);

  return {
    success: false,
    totalRows: rawRows.length,
    keywordInputRowsGenerated: 0,
    searchPlanRowsGenerated: 0,
    errors: [message],
  };
}
