/**
 * 表单引擎 API Client
 * 完全符合 API 文档规范 v2.0 - 50 个接口
 */

import apiClient from '@/lib/api-client';

// ============================================
// 类型定义
// ============================================

export type FormStatus = 'DRAFT' | 'PUBLISHED' | 'ARCHIVED';
export type VersionStatus = 'DRAFT' | 'PENDING_REVIEW' | 'PUBLISHED' | 'REJECTED' | 'DEPRECATED';
export type InstanceStatus = 'DRAFT' | 'SUBMITTED' | 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'CANCELLED';

export interface FormDefinition {
  id: string;
  key: string;
  slug: string;
  slugHistory: string[];
  aliases: string[];
  name: string;
  category: string;
  description?: string;
  icon?: string;
  color?: string;
  defaultLocale: string;
  supportedLocales: string[];
  status: FormStatus;
  requiresApproval: boolean;
  approvalProcessKey?: string;
  latestVersion: number;
  // 组织配置
  organizationId?: string;
  // 统计
  versionCount?: number;
  instanceCount?: number;
  // 元数据
  createdBy: string;
  updatedBy?: string;
  createdAt: string;
  updatedAt: string;
}

export interface FormVersion {
  id: string;
  definitionId: string;
  version: number;
  schema: any;
  uiSchema?: any;
  viewSchema?: any; // 🆕 详情视图配置
  validation?: any;
  nameI18n: Record<string, string>;
  descriptionI18n?: Record<string, string>;
  status: VersionStatus;
  isDefault: boolean;
  changelog?: string;
  // 审核相关
  reviewedBy?: string;
  reviewedAt?: string;
  reviewComment?: string;
  publishedAt?: string;
  // 元数据
  createdBy: string;
  createdAt: string;
}

export interface FormInstance {
  id: string;
  formDefinitionId: string;
  formVersionId: string;
  formKey: string;
  formVersion: number;
  businessKey: string; // 🆕 业务单号
  regionId?: string; // 🆕 区域ID
  data: Record<string, any>;
  status: InstanceStatus;
  createdBy: string;
  updatedBy?: string;
  submittedBy?: string;
  submittedAt?: string;
  approvalInstanceId?: string;
  approvalStatus?: string;
  approvalStartTime?: string;
  approvalEndTime?: string;
  createdAt: string;
  updatedAt: string;
  deletedAt?: string;
  // 关联数据
  definition?: {
    key: string;
    slug: string;
    name: string;
    category: string;
    requiresApproval: boolean;
    approvalProcessKey?: string;
  };
  version?: {
    version: number;
    schema: any;
    uiSchema?: any;
    nameI18n: Record<string, string>;
    descriptionI18n?: Record<string, string>;
  };
  // 🆕 提交者信息（用于表单渲染）
  submitter?: {
    id: string;
    name: string;
    avatar?: string;
    departments: Array<{
      id: string;
      name: string;
    }>;
  };
}

export interface FormTemplate {
  id: string;
  nameI18n: Record<string, string>;
  descriptionI18n?: Record<string, string>;
  category: string;
  icon?: string;
  color?: string;
  template: any;
  isBuiltin: boolean;
  isPublic: boolean;
  createdBy: string;
  createdAt: string;
  updatedAt: string;
  creator?: {
    id: string;
    displayName: string;
  };
}

export interface FormTranslation {
  id: string;
  versionId: string;
  locale: string;
  translations: Record<string, string>;
  createdAt: string;
  updatedAt: string;
}

export interface PaginatedResponse<T> {
  items: T[];
  total: number;
  page: number;
  limit: number;
  totalPages: number;
}

// ============================================
// 1. 表单定义管理 (12 个接口)
// ============================================

export interface CreateFormDefinitionDto {
  key?: string;
  slug: string;
  nameI18n: Record<string, string>;
  descriptionI18n?: Record<string, string>;
  category: string;
  icon?: string;
  color?: string;
  defaultLocale: string;
  supportedLocales: string[];
  requiresApproval: boolean;
  approvalProcessKey?: string;
  aliases?: string[];
  schema: any;
  uiSchema?: any;
  validation?: any;
  translations?: Record<string, Record<string, string>>;
}

export interface UpdateFormDefinitionDto {
  slug?: string;
  nameI18n?: Record<string, string>;
  descriptionI18n?: Record<string, string>;
  category?: string;
  icon?: string;
  color?: string;
  defaultLocale?: string;
  supportedLocales?: string[];
  requiresApproval?: boolean;
  approvalProcessKey?: string;
  aliases?: string[];
}

export interface QueryFormsDto {
  category?: string;
  status?: FormStatus;
  requiresApproval?: boolean;
  search?: string;
  page?: number;
  limit?: number;
}

export interface DuplicateFormDto {
  newSlug: string;
  newName: Record<string, string>;
  copyAllVersions?: boolean;
}

/** 1.1 获取表单列表 */
export async function getForms(params?: QueryFormsDto): Promise<PaginatedResponse<FormDefinition>> {
  return apiClient.get('/forms', { params });
}

/** 1.2 获取表单详情（支持 id/key/slug/alias） */
export async function getFormByIdentifier(identifier: string): Promise<FormDefinition> {
  return apiClient.get(`/forms/${identifier}`);
}

/** 1.3 获取表单详情（带默认版本） */
export async function getFormWithDefaultVersion(identifier: string): Promise<FormDefinition & { defaultVersion: FormVersion }> {
  return apiClient.get(`/forms/${identifier}/with-default`);
}

/** 1.4 创建表单定义 */
export async function createForm(data: CreateFormDefinitionDto): Promise<FormDefinition> {
  return apiClient.post('/forms', data);
}

/** 1.5 更新表单定义 */
export async function updateForm(identifier: string, data: UpdateFormDefinitionDto): Promise<FormDefinition> {
  return apiClient.patch(`/forms/${identifier}`, data);
}

/** 1.6 删除表单定义 */
export async function deleteForm(identifier: string): Promise<{ id: string; deleted: boolean }> {
  return apiClient.delete(`/forms/${identifier}`);
}

/** 1.7 发布表单 */
export async function publishForm(identifier: string): Promise<FormDefinition> {
  return apiClient.post(`/forms/${identifier}/publish`);
}

/** 1.8 归档表单 */
export async function archiveForm(identifier: string, reason?: string): Promise<FormDefinition> {
  return apiClient.post(`/forms/${identifier}/archive`, { reason });
}

/** 1.9 取消归档 */
export async function unarchiveForm(identifier: string): Promise<FormDefinition> {
  return apiClient.post(`/forms/${identifier}/unarchive`);
}

/** 1.10 更新 Slug */
export async function updateFormSlug(identifier: string, newSlug: string): Promise<FormDefinition> {
  return apiClient.patch(`/forms/${identifier}/slug`, { newSlug });
}

/** 1.11 添加别名 */
export async function addFormAliases(identifier: string, aliases: string[]): Promise<FormDefinition> {
  return apiClient.post(`/forms/${identifier}/aliases`, { aliases });
}

/** 1.12 删除别名 */
export async function removeFormAlias(identifier: string, alias: string): Promise<FormDefinition> {
  return apiClient.delete(`/forms/${identifier}/aliases/${alias}`);
}

/** 1.13 复制表单 */
export async function duplicateForm(identifier: string, data: DuplicateFormDto): Promise<FormDefinition> {
  return apiClient.post(`/forms/${identifier}/duplicate`, data);
}

/** 1.14 获取表单统计 */
export async function getFormStats(identifier: string): Promise<{
  formId: string;
  totalInstances: number;
  draftCount: number;
  submittedCount: number;
  approvedCount: number;
  rejectedCount: number;
  cancelledCount: number;
  submissionRate: number;
  averageCompletionTime: number;
  lastSubmittedAt?: string;
}> {
  return apiClient.get(`/forms/${identifier}/stats`);
}

// ============================================
// 2. 表单版本管理 (10 个接口)
// ============================================

export interface CreateFormVersionDto {
  schema: any;
  uiSchema?: any;
  viewSchema?: any;
  validation?: any;
  nameI18n: Record<string, string>;
  descriptionI18n?: Record<string, string>;
  translations?: Record<string, Record<string, string>>;
  changelog?: string;
  setAsDefault?: boolean;
}

export interface UpdateFormVersionDto {
  schema?: any;
  uiSchema?: any;
  viewSchema?: any;
  validation?: any;
  nameI18n?: Record<string, string>;
  descriptionI18n?: Record<string, string>;
  changelog?: string;
}

export interface SubmitForReviewDto {
  note?: string;
}

export interface ReviewVersionDto {
  action: 'approve' | 'reject';
  comment?: string;
}

/** 2.1 获取版本列表 */
export async function getFormVersions(formIdentifier: string): Promise<FormVersion[]> {
  return apiClient.get(`/forms/${formIdentifier}/versions`);
}

/** 2.2 获取版本详情 */
export async function getFormVersion(formIdentifier: string, version: number): Promise<FormVersion> {
  return apiClient.get(`/forms/${formIdentifier}/versions/${version}`);
}

/** 2.3 创建新版本 */
export async function createFormVersion(formIdentifier: string, data: CreateFormVersionDto): Promise<FormVersion> {
  return apiClient.post(`/forms/${formIdentifier}/versions`, data);
}

/** 2.4 更新版本 */
export async function updateFormVersion(formIdentifier: string, version: number, data: UpdateFormVersionDto): Promise<FormVersion> {
  return apiClient.patch(`/forms/${formIdentifier}/versions/${version}`, data);
}

/** 2.5 提交版本审核 🆕 */
export async function submitVersionForReview(formIdentifier: string, version: number, data?: SubmitForReviewDto): Promise<FormVersion> {
  return apiClient.post(`/forms/${formIdentifier}/versions/${version}/submit-review`, data || {});
}

/** 2.6 审核版本 🆕 */
export async function reviewVersion(formIdentifier: string, version: number, data: ReviewVersionDto): Promise<FormVersion> {
  return apiClient.post(`/forms/${formIdentifier}/versions/${version}/review`, data);
}

/** 2.7 发布版本 */
export async function publishFormVersion(formIdentifier: string, version: number, setAsDefault?: boolean): Promise<FormVersion> {
  return apiClient.post(`/forms/${formIdentifier}/versions/${version}/publish`, { setAsDefault });
}

/** 2.8 设置默认版本 */
export async function setDefaultFormVersion(formIdentifier: string, version: number): Promise<FormVersion> {
  return apiClient.post(`/forms/${formIdentifier}/versions/_actions/set-default`, { version });
}

/** 2.9 废弃版本 */
export async function deprecateFormVersion(formIdentifier: string, version: number): Promise<FormVersion> {
  return apiClient.post(`/forms/${formIdentifier}/versions/${version}/deprecate`);
}

/** 2.10 版本对比 */
export async function compareFormVersions(formIdentifier: string, from: number, to: number): Promise<{
  fromVersion: number;
  toVersion: number;
  changes: {
    schemaChanges: any;
    uiSchemaChanges: any;
    added: string[];
    removed: string[];
    modified: string[];
  };
}> {
  return apiClient.get(`/forms/${formIdentifier}/versions/compare`, { params: { from, to } });
}

// ============================================
// 3. 表单实例管理 (12 个接口)
// ============================================

export interface CreateFormInstanceDto {
  formIdentifier: string;
  version?: number;
  data: Record<string, any>;
  regionId?: string;
}

export interface UpdateFormInstanceDto {
  data: Record<string, any>;
}

export interface SubmitFormInstanceDto {
  data: Record<string, any>;
  comment?: string;
  submitForApproval?: boolean;
}

export interface CancelFormInstanceDto {
  reason?: string;
}

export interface QueryMyFormInstancesDto {
  formKey?: string;
  status?: InstanceStatus;
  startDate?: string;
  endDate?: string;
  page?: number;
  limit?: number;
}

export interface QueryAllFormInstancesDto extends QueryMyFormInstancesDto {
  createdBy?: string;
  includeDeleted?: boolean;
  regionId?: string;
}

export interface BatchUpdateStatusDto {
  instanceIds: string[];
  status: InstanceStatus;
  comment?: string;
}

export interface ExportFormInstancesDto {
  formKey: string;
  format: 'excel' | 'csv';
  startDate?: string;
  endDate?: string;
  status?: InstanceStatus;
}

export interface FormInstanceStatsDto {
  formKey: string;
  startDate?: string;
  endDate?: string;
}

/** 3.1 创建表单实例 */
export async function createFormInstance(data: CreateFormInstanceDto): Promise<FormInstance> {
  return apiClient.post('/form-instances', data);
}

/** 3.2 获取我的实例列表 */
export async function getMyFormInstances(params?: QueryMyFormInstancesDto): Promise<PaginatedResponse<FormInstance>> {
  return apiClient.get('/form-instances/my', { params });
}

/** 3.3 获取实例详情 */
export async function getFormInstance(instanceIdentifier: string): Promise<FormInstance> {
  return apiClient.get(`/form-instances/${instanceIdentifier}`);
}

/** 3.4 更新实例 */
export async function updateFormInstance(instanceIdentifier: string, data: UpdateFormInstanceDto): Promise<FormInstance> {
  return apiClient.patch(`/form-instances/${instanceIdentifier}`, data);
}

/** 3.5 删除实例（软删除） */
export async function deleteFormInstance(instanceIdentifier: string): Promise<{ id: string; deleted: boolean }> {
  return apiClient.delete(`/form-instances/${instanceIdentifier}`);
}

/** 3.6 提交实例 */
export async function submitFormInstance(instanceIdentifier: string, data: SubmitFormInstanceDto): Promise<FormInstance> {
  return apiClient.post(`/form-instances/${instanceIdentifier}/submit`, data);
}

/** 3.7 取消实例 */
export async function cancelFormInstance(instanceIdentifier: string, data?: CancelFormInstanceDto): Promise<FormInstance> {
  return apiClient.post(`/form-instances/${instanceIdentifier}/cancel`, data || {});
}

/** 3.8 恢复实例 🆕 */
export async function restoreFormInstance(instanceIdentifier: string): Promise<{ id: string; restored: boolean }> {
  return apiClient.post(`/form-instances/${instanceIdentifier}/restore`);
}

/** 3.9 获取所有实例 (Admin) */
export async function getAllFormInstances(params?: QueryAllFormInstancesDto): Promise<PaginatedResponse<FormInstance>> {
  return apiClient.get('/form-instances', { params });
}

/** 3.10 批量更新状态 (Admin) */
export async function batchUpdateInstanceStatus(data: BatchUpdateStatusDto): Promise<{
  updated: number;
  failed: number;
  errors: Array<{ id: string; error: string }>;
}> {
  return apiClient.post('/form-instances/batch-update-status', data);
}

/** 3.11 导出数据 (Admin) */
export async function exportFormInstances(params: ExportFormInstancesDto): Promise<Blob> {
  return apiClient.get('/form-instances/export', {
    params,
    responseType: 'blob',
  });
}

/** 3.12 实例统计 (Admin) */
export async function getFormInstanceStats(params: FormInstanceStatsDto): Promise<{
  formKey: string;
  totalInstances: number;
  statusBreakdown: Record<InstanceStatus, number>;
  dailySubmissions: Array<{ date: string; count: number }>;
  averageCompletionTime: number;
}> {
  return apiClient.get('/form-instances/stats', { params });
}

/** 获取审批状态 */
export async function getFormInstanceApprovalStatus(instanceIdentifier: string): Promise<{
  instanceId: string;
  approvalInstanceId?: string;
  approvalStatus?: string;
  currentStep?: any;
  history?: any[];
}> {
  return apiClient.get(`/form-instances/${instanceIdentifier}/approval-status`);
}

/** 撤回表单 */
export async function withdrawFormInstance(instanceIdentifier: string): Promise<FormInstance> {
  return apiClient.post(`/form-instances/${instanceIdentifier}/withdraw`);
}

// ============================================
// 4. 表单翻译管理 (6 个接口)
// ============================================

export interface UpsertTranslationDto {
  translations: Record<string, string>;
}

export interface BatchImportTranslationsDto {
  translations: Record<string, Record<string, string>>;
  overwrite?: boolean;
}

/** 4.1 获取翻译列表 */
export async function getFormTranslations(formIdentifier: string, version: number): Promise<{ items: FormTranslation[] }> {
  return apiClient.get(`/forms/${formIdentifier}/versions/${version}/translations`);
}

/** 4.2 获取指定语言翻译 */
export async function getFormTranslation(formIdentifier: string, version: number, locale: string): Promise<FormTranslation> {
  return apiClient.get(`/forms/${formIdentifier}/versions/${version}/translations/${locale}`);
}

/** 4.3 创建/更新翻译 */
export async function upsertFormTranslation(
  formIdentifier: string,
  version: number,
  locale: string,
  data: UpsertTranslationDto
): Promise<FormTranslation> {
  return apiClient.put(`/forms/${formIdentifier}/versions/${version}/translations/${locale}`, data);
}

/** 4.4 删除翻译 */
export async function deleteFormTranslation(formIdentifier: string, version: number, locale: string): Promise<{ deleted: boolean }> {
  return apiClient.delete(`/forms/${formIdentifier}/versions/${version}/translations/${locale}`);
}

/** 4.5 检查翻译完整性 */
export async function checkTranslationCompleteness(formIdentifier: string, version: number, locale: string): Promise<{
  locale: string;
  isComplete: boolean;
  coverage: number;
  totalRequired: number;
  translated: number;
  missingKeys: string[];
}> {
  return apiClient.get(`/forms/${formIdentifier}/versions/${version}/translations/${locale}/check`);
}

/** 4.6 批量导入翻译 */
export async function batchImportTranslations(
  formIdentifier: string,
  version: number,
  data: BatchImportTranslationsDto
): Promise<{
  imported: number;
  created: number;
  updated: number;
  failed: number;
  errors: Array<{ locale: string; error: string }>;
}> {
  return apiClient.post(`/forms/${formIdentifier}/versions/${version}/translations/import`, data);
}

// ============================================
// 5. 表单模板管理 (6 个接口)
// ============================================

export interface CreateFormTemplateDto {
  nameI18n: Record<string, string>;
  descriptionI18n?: Record<string, string>;
  category: string;
  icon?: string;
  color?: string;
  template: any;
  isBuiltin: boolean;
  isPublic: boolean;
}

export interface UpdateFormTemplateDto {
  nameI18n?: Record<string, string>;
  descriptionI18n?: Record<string, string>;
  category?: string;
  icon?: string;
  color?: string;
  template?: any;
  isPublic?: boolean;
}

export interface QueryFormTemplatesDto {
  category?: string;
  isPublic?: boolean;
  search?: string;
  page?: number;
  limit?: number;
}

export interface CreateFormFromTemplateDto {
  slug: string;
  name: Record<string, string>;
  category?: string;
}

/** 5.1 获取模板列表 */
export async function getFormTemplates(params?: QueryFormTemplatesDto): Promise<PaginatedResponse<FormTemplate>> {
  return apiClient.get('/form-templates', { params });
}

/** 5.2 获取模板详情 */
export async function getFormTemplate(templateIdentifier: string): Promise<FormTemplate> {
  return apiClient.get(`/form-templates/${templateIdentifier}`);
}

/** 5.3 创建模板 */
export async function createFormTemplate(data: CreateFormTemplateDto): Promise<FormTemplate> {
  return apiClient.post('/form-templates', data);
}

/** 5.4 更新模板 */
export async function updateFormTemplate(templateIdentifier: string, data: UpdateFormTemplateDto): Promise<FormTemplate> {
  return apiClient.patch(`/form-templates/${templateIdentifier}`, data);
}

/** 5.5 删除模板 */
export async function deleteFormTemplate(templateIdentifier: string): Promise<{ id: string; deleted: boolean }> {
  return apiClient.delete(`/form-templates/${templateIdentifier}`);
}

/** 5.6 从模板创建表单 */
export async function createFormFromTemplate(templateIdentifier: string, data: CreateFormFromTemplateDto): Promise<FormDefinition> {
  return apiClient.post(`/form-templates/${templateIdentifier}/create-form`, data);
}

// ============================================
// 6. 版本审核管理 (4 个接口) 🆕
// ============================================

export interface QueryPendingReviewDto {
  category?: string;
  page?: number;
  limit?: number;
}

export interface QueryMySubmissionsDto {
  status?: 'pending' | 'approved' | 'rejected';
  page?: number;
  limit?: number;
}

export interface PendingReviewItem {
  id: string;
  formKey: string;
  formName: string;
  version: number;
  submittedBy: string;
  submittedByName?: string;
  submittedAt: string;
  note?: string;
  category: string;
}

export interface ReviewHistoryItem {
  id: string;
  action: 'submit' | 'approve' | 'reject';
  userId: string;
  userName?: string;
  comment?: string;
  createdAt: string;
}

/** 6.1 获取待审核列表 (Admin) */
export async function getPendingReviewVersions(params?: QueryPendingReviewDto): Promise<PaginatedResponse<PendingReviewItem>> {
  return apiClient.get('/form-versions/pending-review', { params });
}

/** 6.2 预览待审核表单 (Admin) */
export async function previewPendingReviewVersion(versionId: string): Promise<{
  version: FormVersion;
  form: FormDefinition;
  diff?: {
    previousVersion: number;
    changes: any;
  };
}> {
  return apiClient.get(`/form-versions/${versionId}/preview`);
}

/** 6.3 获取审核历史 */
export async function getVersionReviewHistory(versionId: string): Promise<ReviewHistoryItem[]> {
  return apiClient.get(`/form-versions/${versionId}/review-history`);
}

/** 6.4 我提交的审核 */
export async function getMySubmissions(params?: QueryMySubmissionsDto): Promise<PaginatedResponse<{
  id: string;
  version: number;
  status: VersionStatus;
  form: {
    id: string;
    key: string;
    slug: string;
    name: string;
  };
  submittedAt: string;
  reviewedAt?: string;
  reviewedBy?: string;
  reviewComment?: string;
}>> {
  return apiClient.get('/form-versions/my-submissions', { params });
}
