import type {
  ContractStatus,
  GeoLocationStatus,
  MerchantDocumentStatus,
  MerchantDocumentType,
  MerchantStatus,
  OperatingMode,
  StaffRoleType,
  StaffStatus,
  StoreStatus,
} from '#/enums/merchantEnum';

import { requestClient } from '#/api/request';

export * from '#/enums/merchantEnum';

/**
 * 商户门店信息
 */
export interface MerchantStoreDto {
  /** 门店ID */
  id: string;
  /** 门店名称 */
  name: string;
  /** 营业执照号 */
  licenseNumber?: string;
  /** 联系电话 */
  contactPhone?: string;
  /** 门店地址 */
  address: string;
  /** 门店状态 */
  status: StoreStatus;
}

/**
 * 商户详情信息
 */
export interface MerchantDetailDto {
  /** 商户ID */
  id: string;
  /** 租户ID */
  tenantId: string;
  /** 租户名称 */
  tenantName?: string;
  /** 商户名称 */
  name: string;
  /** 经营模式 */
  operatingMode?: OperatingMode;
  /** 营业执照号 */
  licenseNumber?: string;
  /** 法人/负责人 */
  legalRepresentative?: string;
  /** 注册地址 */
  registeredAddress?: string;
  /** 所在省份 */
  province?: string;
  /** 所在城市 */
  city?: string;
  /** 所在区县 */
  district?: string;
  /** 商户经度 */
  longitude?: null | number;
  /** 商户纬度 */
  latitude?: null | number;
  /** 地理定位状态 */
  geoStatus?: GeoLocationStatus;
  /** 地理定位失败原因 */
  geoFailReason?: string;
  /** 地理定位成功时间 */
  geoUpdatedAt?: null | string;
  /** 联系电话 */
  contactPhone?: string;
  /** 联系邮箱 */
  contactEmail?: string;
  /** 商户状态 */
  status: MerchantStatus;
  /** 是否冻结 */
  isFrozen: boolean;
  /** 冻结原因 */
  frozenReason?: string;
  /** 冻结时间 */
  frozenAt?: null | string;
  /** 审核通过人 */
  approvedBy?: string;
  /** 审核通过时间 */
  approvedAt?: null | string;
  /** 关联门店 */
  stores: MerchantStoreDto[];
  /** 并发版本 */
  rowVersion?: string;
  /** 创建时间 */
  createdAt: string;
  /** 创建人 */
  createdBy?: string;
  /** 更新时间 */
  updatedAt?: null | string;
  /** 更新人 */
  updatedBy?: string;
}

/**
 * 商户资质信息
 */
export interface MerchantDocumentDto {
  id: string;
  merchantId: string;
  documentType: MerchantDocumentType;
  status: MerchantDocumentStatus;
  fileUrl: string;
  documentNumber?: string;
  issuedAt?: null | string;
  expiresAt?: null | string;
  remarks?: string;
  createdAt: string;
}

/**
 * 商户合同信息
 */
export interface MerchantContractDto {
  id: string;
  merchantId: string;
  contractNumber: string;
  status: ContractStatus;
  startDate: string;
  endDate: string;
  fileUrl: string;
  signedAt?: null | string;
  terminatedAt?: null | string;
  terminationReason?: string;
}

/**
 * 商户员工信息
 */
export interface MerchantStaffDto {
  id: string;
  tenantId: string;
  merchantId: string;
  storeId?: null | string;
  name: string;
  phone: string;
  email?: string;
  roleType: StaffRoleType;
  status: StaffStatus;
}

/**
 * 商户审核日志
 */
export interface MerchantAuditLogDto {
  id: string;
  merchantId: string;
  action: number; // MerchantAuditAction (need to define)
  operatorId?: string;
  title: string;
  description?: string;
  operatorName?: string;
  ipAddress?: string;
  createdAt: string;
}

/**
 * 商户变更日志
 */
export interface MerchantChangeLogDto {
  id: string;
  fieldName: string;
  oldValue?: string;
  newValue?: string;
  changedBy?: string;
  changedByName?: string;
  changedAt: string;
  changeReason?: string;
}

/**
 * 商户中心聚合信息
 */
export interface CurrentMerchantCenterDto {
  merchant: MerchantDetailDto;
  documents: MerchantDocumentDto[];
  contracts: MerchantContractDto[];
  staffs: MerchantStaffDto[];
  auditLogs: MerchantAuditLogDto[];
  changeLogs: MerchantChangeLogDto[];
}

/**
 * 获取当前商户中心信息
 */
export async function getMerchantInfoApi() {
  return requestClient.get<CurrentMerchantCenterDto>('/merchant/info');
}

/**
 * 更新商户信息参数
 */
export interface UpdateMerchantDto {
  id: string;
  name: string;
  operatingMode?: OperatingMode;
  licenseNumber?: string;
  legalRepresentative?: string;
  contactPhone?: string;
  contactEmail?: string;
  registeredAddress?: string;
}

/**
 * 更新商户信息
 */
export async function updateMerchantInfoApi(data: UpdateMerchantDto) {
  return requestClient.post('/merchant/update', data);
}

/** 手动重试当前商户地理定位 */
export async function retryMerchantGeocodeApi() {
  return requestClient.post('/merchant/geocode/retry');
}
