// ===== 通用类型 =====

import { QuestionScoringType } from '@/components/answer-sheet-preview/composables/useQuestionList';

/** 坐标格式 xywh (x, y, width, height) */
export type AICoordinate = string;

/** 方向枚举 */
export type AIDirection = '0' | '90' | '180' | '270';

// ===== 异常检测和修正 =====

/** 异常检测响应 */
export interface AIAbnormalResponse {
  is_blank: boolean;
  is_folded: boolean;
}

/** 空白检测响应 */
export interface AIBlankResponse {
  is_blank: boolean;
}

/** 折角检测响应 */
export interface AIFoldedResponse {
  is_folded: boolean;
}

/** 倾斜和颠倒矫正响应 */
export interface AICorrectionResponse {
  /** 图片的方向，取值为 0 90 180 270 */
  direction: AIDirection;
  /** 模型对于方向判断的置信度，最大为 1，最小为 0 */
  direction_confidence: number;
  /** 图片向顺时针方向倾斜的角度，可以为负 */
  bias_angle: number;
  /** 对图片执行的顺时针旋转角度 */
  rotation_applied: number;
  /** 矫正后图片的 base64 编码 */
  image: string;
}

// ===== 版面和子题分割 =====

/** 子题分割响应 */
export interface AISegmentResponse {
  /** 坐标信息 */
  boxes: string[];
}

// ===== 局部检测和识别 =====

/** 填涂考号识别响应 */
export interface AIExamOptionResponse {
  result: {
    /** 识别出的填涂考号 */
    student_idfilling: number[];
    /** 按照列分组给出的所有填涂框的坐标，xywh 格式 */
    all_coordinates: Record<string, AICoordinate[]>;
  };
}

/** 条形码识别响应 */
export type AIBarCodeResponse = string;

/** OCR识别响应 */
export interface AIOCRResponse {
  txts: string[];
}

/** 选择题识别响应 */
export interface AISelectOptionsResponse {
  /** 题号 */
  question_numbers: string[];
  /** 答案 */
  answers: string[][];
  /** 所有填涂框的坐标，xywh 格式 */
  select_boxes: number[][][];
  /** 警告信息 */
  warns: number[];
  /** 题目框 */
  boxes: number[][];
}

// ===== 模板相关 =====

/** 通知块 */
export interface AINotationBlock {
  notation: boolean;
  area_pos: AICoordinate;
}

/** 区域块 */
export interface AIAreaBlock {
  /** 区域坐标 */
  area_pos: AICoordinate;
  /** 识别的内容 - 动态字段 */
  [key: string]: string;
}

/** 学生考号填涂块 */
export interface AIStudentIdBlock {
  /** 区域坐标 */
  area_pos: AICoordinate;
  /** 识别的考号内容 */
  student_idhand: string;
  /** 按列给出的所有填涂框的坐标 */
  boxes: Record<string, AICoordinate[]>;
}

/** 学生条形码块 */
export interface AIStudentBarcodeBlock {
  /** 区域坐标 */
  area_pos: AICoordinate;
  /** 识别的条形码内容 */
  student_idzbar: string;
}

/** 题目块 */
export interface AIQuestionBlock {
  /** 此题目位于传入图片列表中的第几张图 */
  image_index: number;
  /** 大题号 */
  question_major: string;
  /** 小题号 */
  question_minor: string;
  /** AI识别的题目类型 */
  ai_question_type: string;
  /** 题型 */
  question_type: string;
  /** 题目总分 */
  full_score: number;
  /** 题目半分 */
  half_score: number;
  /** 题目得分类型 */
  scoring_type: QuestionScoringType;
  /** 标准答案 */
  standard_answer: string;
  /** 识别答题卡返回的答案 */
  answer: string;
  /** 题目坐标信息 */
  area_pos: AICoordinate;
  /** 客观题选项框坐标（仅客观题有） */
  select_boxes?: AICoordinate[];
  /** 低风险字段（可选） */
  risk_low?: boolean;
  /** 题目ID */
  question_id?: number;
}

/** 评分框块 */
export interface AIScoreBlock {
  /** 打分框位于第几张图片 */
  index: number;
  /** 打分框的坐标 */
  pos: [number, number, number, number];
}

/** 正反面区域块 */
export interface AIFrontBackAreaBlock {
  area_pos: AICoordinate;
  front_ratio: number;
  back_ratio: number;
}

/** 颠倒识别区域块 */
export interface AIUpsideDownAreaBlock {
  [imageIndex: string]: {
    area_pos: AICoordinate;
    ratio: number;
    rotated_ratio: number;
  };
}

export interface AIAreaBlockExtended {
  image_index: number;
  question_major: string;
  ai_question_type: string;
  question_type: string;
  area_pos: string;
}

/** 模板数据 */
export interface AITemplateData {
  absence_notation_block: AINotationBlock;
  paper_a_notation_block: AINotationBlock;
  paper_b_notation_block: AINotationBlock;
  additional_question_notation_block: AINotationBlock;
  exam_title_block: AIAreaBlock;
  student_hand_block: AIAreaBlock;
  student_idfilling_block: AIStudentIdBlock;
  student_idzbar_block: AIStudentBarcodeBlock;
  student_name_block: AIAreaBlock;
  question_block: AIQuestionBlock[];
  score_rectangles_block: AIScoreBlock[];
  front_back_area_block?: AIFrontBackAreaBlock;
  upside_down_area_block?: AIUpsideDownAreaBlock;
  area_block: AIAreaBlockExtended[];
}

/** 模板生成结果 */
export interface AITemplateResults {
  success: boolean;
  modify_time: string;
  template_id: string;
  md5_digest: string;
  image?: string[];
  template_images: string[];
  resolution: [number, number][];
  is_blank: boolean[];
  is_folded: boolean[];
  is_upside_down: boolean[];
  direction: AIDirection[];
  rotate_angle: number[];
  data: AITemplateData;
}

/** 模板生成请求 */
export interface AITemplateRecognizeRequest {
  image: string[];
}

/** 模板修改请求 */
export type AITemplateModifyRequest = AITemplateResults;

/** 文字定位区更新请求 */
export interface AIUpdateFrontBackAreaRequest {
  template_id: string;
  area_pos: AICoordinate;
  front_image: string;
  back_image: string;
}

/** 文字定位区更新响应 */
export interface AIUpdateFrontBackAreaResponse {
  success: boolean;
  error?: string;
  front_ratio?: number;
  back_ratio?: number;
  template?: AITemplateResults;
}

/** 颠倒识别定位区更新请求 */
export interface AIUpdateUpsideDownAreaRequest {
  template_id: string;
  area_pos: AICoordinate;
  image_index: number;
  image_url: string;
}

/** 颠倒识别定位区更新响应 */
export interface AIUpdateUpsideDownAreaResponse {
  success: boolean;
  error?: string;
  ratio?: number;
  rotated_ratio?: number;
  template?: AITemplateResults;
}

/** 内容识别请求 */
export interface AIBatchRecognizeRequest {
  template_id: string;
  md5_digest: string;
  images: string[][];
}

/** 内容识别结果 */
export interface AIRecognizeResult {
  md5_digest: string;
  image: string[];
  success: boolean;
  is_blank: boolean[];
  is_folded: boolean[];
  is_upside_down: boolean[];
  rotate_angle: number[];
  front_back: boolean[];
  risk_high: boolean[];
  absence_notation: boolean;
  paper_a_notation: boolean;
  paper_b_notation: boolean;
  additional_question_notation: boolean;
  data: Omit<AITemplateData, 'front_back_area_block'>;
}

/** 内容识别响应 */
export interface AIBatchRecognizeResponse {
  results: AIRecognizeResult[];
}

/** 模板列表项 */
export interface AITemplateListItem {
  template_id: string;
  modify_time: string;
  md5_digest: string;
  template_images: string[];
  success: boolean;
  question_count: number;
  score_rectangles_count: number;
  exam_title: string;
}

/** 模板列表响应 */
export interface AITemplateListResponse {
  success: boolean;
  count: number;
  templates: AITemplateListItem[];
}

/** 模板获取响应 */
export interface AITemplateGetResponse {
  success: boolean;
  template?: AITemplateResults;
  error?: string;
  template_id?: string;
}

/** 模板删除响应 */
export interface AITemplateDeleteResponse {
  success: boolean;
  message?: string;
  error?: string;
}

/** 新增模板请求 */
export type AITemplateCreateRequest = Omit<AITemplateResults, 'template_id'> & {
  md5_digest: string;
};

/** 新增模板响应 */
export type AITemplateCreateResponse =
  | AITemplateResults
  | {
      success: false;
      message: string;
      template_id: string;
    };

/** 直接识别请求 */
export interface AIDirectRecognizeRequest {
  images: string[][];
}

/** 直接识别响应 */
export type AIDirectRecognizeResponse = AIBatchRecognizeResponse;

/** 应用偏移和缩放请求 */
export interface AIApplyOffsetAndScaleRequest {
  template_id?: string;
  template_data?: AITemplateResults;
  width: number;
  height: number;
  offset_x: number;
  offset_y: number;
}

/** 应用偏移和缩放响应 */
export interface AIApplyOffsetAndScaleResponse {
  success: boolean;
  message: string;
  template_data?: AITemplateResults;
}
