import type { CordysAxios } from '@lib/shared/api/http/Axios';
import {
  AddBusinessViewUrl,
  AddOpportunityStageUrl,
  AddOptFollowPlanUrl,
  AddOptFollowRecordUrl,
  AddQuotationUrl,
  AddQuotationViewUrl,
  AdvancedSearchOptDetailUrl,
  AdvancedSearchOptPageUrl,
  ApprovalQuotationUrl,
  BatchApproveUrl,
  BatchUpdateQuotationUrl,
  BatchUpdateOpportunityUrl,
  BatchVoidedUrl,
  CancelOptFollowPlanUrl,
  DeleteBusinessViewUrl,
  DeleteOpportunityStageUrl,
  DeleteOptFollowPlanUrl,
  DeleteOptFollowRecordUrl,
  DeleteQuotationUrl,
  DeleteQuotationViewUrl,
  DownloadOptTemplateUrl,
  DownloadQuotationUrl,
  DragBusinessViewUrl,
  DragQuotationViewUrl,
  EnableBusinessViewUrl,
  EnableQuotationViewUrl,
  ExportOpportunityAllUrl,
  ExportOpportunitySelectedUrl,
  FixedBusinessViewUrl,
  FixedQuotationViewUrl,
  GenerateOpportunityChartUrl,
  GetBusinessViewDetailUrl,
  GetBusinessViewListUrl,
  GetOpportunityContactListUrl,
  GetOpportunityStageConfigUrl,
  GetOptDetailUrl,
  GetOptFollowPlanUrl,
  GetOptFollowRecordUrl,
  GetOptFormConfigUrl,
  GetOptStatisticUrl,
  GetOptTabUrl,
  GetQuotationDetailUrl,
  GetQuotationFormConfigUrl,
  GetQuotationSnapshotDetailUrl,
  GetQuotationSnapshotFormConfigUrl,
  GetQuotationTabUrl,
  GetQuotationViewDetailUrl,
  GetQuotationViewListUrl,
  GlobalSearchOptPageUrl,
  ImportOpportunityUrl,
  OptAddUrl,
  OptBatchDeleteUrl,
  OptBatchTransferUrl,
  OptDeleteUrl,
  OptFollowPlanPageUrl,
  OptFollowRecordListUrl,
  OptPageUrl,
  OptUpdateStageUrl,
  OptUpdateUrl,
  PreCheckOptImportUrl,
  QuotationPageUrl,
  RevokeQuotationUrl,
  SortOpportunityStageUrl,
  SortOpportunityUrl,
  UpdateBusinessViewUrl,
  UpdateOpportunityStageRollbackUrl,
  UpdateOpportunityStageUrl,
  UpdateOptFollowPlanStatusUrl,
  UpdateOptFollowPlanUrl,
  UpdateOptFollowRecordUrl,
  UpdateQuotationUrl,
  UpdateQuotationViewUrl,
  VoidQuotationUrl,
} from '@lib/shared/api/requrls/opportunity';
import type {
  ChartResponseDataItem,
  CommonList,
  GenerateChartParams,
  TableDraggedParams,
  TableExportParams,
  TableExportSelectedParams,
  TableQueryParams,
} from '@lib/shared/models/common';
import type {
  BatchUpdatePoolAccountParams,
  CustomerContractTableParams,
  CustomerFollowPlanTableParams,
  CustomerFollowRecordTableParams,
  CustomerTabHidden,
  FollowDetailItem,
  SaveCustomerFollowPlanParams,
  SaveCustomerFollowRecordParams,
  TransferParams,
  UpdateCustomerFollowPlanParams,
  UpdateCustomerFollowRecordParams,
  UpdateFollowPlanStatusParams,
} from '@lib/shared/models/customer';
import type {
  AddOpportunityStageParams,
  ApproveQuotation,
  BatchOperationResult,
  BatchUpdateQuotationStatusParams,
  BatchVoidQuotationStatusParams,
  StageBoardPageQueryParams,
  StageBoardDraggedParams,
  OpportunityDetail,
  OpportunityItem,
  OpportunityStageConfig,
  QuotationItem,
  QuotationQueryParams,
  SaveOpportunityParams,
  SaveQuotationParams,
  UpdateOpportunityParams,
  UpdateOpportunityStageParams,
  UpdateOpportunityStageRollbackParams,
  UpdateQuotationParams,
} from '@lib/shared/models/opportunity';
import type { FormDesignConfigDetailParams } from '@lib/shared/models/system/module';
import { ValidateInfo } from '@lib/shared/models/system/org';
import type { ViewItem, ViewParams } from '@lib/shared/models/view';

export default function useProductApi(CDR: CordysAxios) {
  // 商机列表
  function getOpportunityList(data: StageBoardPageQueryParams) {
    return CDR.post<CommonList<OpportunityItem>>({ url: OptPageUrl, data }, { ignoreCancelToken: true });
  }

  // 添加商机
  function addOpportunity(data: SaveOpportunityParams) {
    return CDR.post({ url: OptAddUrl, data });
  }

  // 更新商机
  function updateOpportunity(data: UpdateOpportunityParams) {
    return CDR.post({ url: OptUpdateUrl, data });
  }

  // 商机详情
  function getOpportunityDetail(id: string) {
    return CDR.get<OpportunityDetail>({ url: `${GetOptDetailUrl}/${id}` });
  }

  // 商机看板拖拽排序
  function sortOpportunity(data: StageBoardDraggedParams) {
    return CDR.post({ url: SortOpportunityUrl, data });
  }

  // 获取商机表单配置
  function getOptFormConfig() {
    return CDR.get<FormDesignConfigDetailParams>({ url: GetOptFormConfigUrl });
  }

  // 商机跟进记录列表
  function getOptFollowRecordList(data: CustomerFollowRecordTableParams) {
    return CDR.post<CommonList<FollowDetailItem>>({ url: OptFollowRecordListUrl, data });
  }

  // 删除商机跟进记录
  function deleteOptFollowRecord(id: string) {
    return CDR.get({ url: `${DeleteOptFollowRecordUrl}/${id}` });
  }

  // 添加商机跟进记录
  function addOptFollowRecord(data: SaveCustomerFollowRecordParams) {
    return CDR.post({ url: AddOptFollowRecordUrl, data });
  }

  // 更新商机跟进记录
  function updateOptFollowRecord(data: UpdateCustomerFollowRecordParams) {
    return CDR.post({ url: UpdateOptFollowRecordUrl, data });
  }

  // 获取商机跟进记录详情
  function getOptFollowRecord(id: string) {
    return CDR.get<FollowDetailItem>({ url: `${GetOptFollowRecordUrl}/${id}` });
  }

  // 跟进计划列表
  function getOptFollowPlanList(data: CustomerFollowPlanTableParams) {
    return CDR.post<CommonList<FollowDetailItem>>({ url: OptFollowPlanPageUrl, data });
  }

  // 添加商机跟进计划
  function addOptFollowPlan(data: SaveCustomerFollowPlanParams) {
    return CDR.post({ url: AddOptFollowPlanUrl, data });
  }

  // 更新商机跟进计划
  function updateOptFollowPlan(data: UpdateCustomerFollowPlanParams) {
    return CDR.post({ url: UpdateOptFollowPlanUrl, data });
  }

  // 删除商机跟进计划
  function deleteOptFollowPlan(id: string) {
    return CDR.get({ url: `${DeleteOptFollowPlanUrl}/${id}` });
  }

  // 获取商机跟进计划详情
  function getOptFollowPlan(id: string) {
    return CDR.get<FollowDetailItem>({ url: `${GetOptFollowPlanUrl}/${id}` });
  }

  // 取消商机跟进计划
  function cancelOptFollowPlan(id: string) {
    return CDR.get({ url: `${CancelOptFollowPlanUrl}/${id}` });
  }

  // 批量转移商机
  function transferOpt(data: TransferParams) {
    return CDR.post({ url: OptBatchTransferUrl, data });
  }

  // 批量删除商机
  function batchDeleteOpt(data: (string | number)[]) {
    return CDR.post({ url: OptBatchDeleteUrl, data });
  }

  // 删除商机
  function deleteOpt(id: string) {
    return CDR.get({ url: `${OptDeleteUrl}/${id}` });
  }

  // 更新商机阶段
  function updateOptStage(data: { id: string; stage: string; failureReason?: string | null }) {
    return CDR.post({ url: OptUpdateStageUrl, data });
  }

  // 获取商机tab显隐藏
  function getOptTab() {
    return CDR.get<CustomerTabHidden>({ url: GetOptTabUrl });
  }

  // 获取商机联系人列表
  function getOpportunityContactList(data: CustomerContractTableParams) {
    return CDR.get({ url: `${GetOpportunityContactListUrl}/${data.id}` });
  }

  // 更新商机跟进计划状态
  function updateOptFollowPlanStatus(data: UpdateFollowPlanStatusParams) {
    return CDR.post({ url: UpdateOptFollowPlanStatusUrl, data });
  }

  // 导出全量商机列表
  function exportOpportunityAll(data: TableExportParams) {
    return CDR.post({ url: ExportOpportunityAllUrl, data });
  }

  // 导出选中商机列表
  function exportOpportunitySelected(data: TableExportSelectedParams) {
    return CDR.post({ url: ExportOpportunitySelectedUrl, data });
  }

  // 商机列表的金额数据
  function getOptStatistic(data: TableQueryParams) {
    return CDR.post({ url: GetOptStatisticUrl, data }, { ignoreCancelToken: true });
  }

  // 更新商机阶段配置
  function updateOpportunityStage(data: UpdateOpportunityStageParams) {
    return CDR.post({ url: UpdateOpportunityStageUrl, data });
  }

  // 商机阶段回退配置
  function updateOpportunityStageRollback(data: UpdateOpportunityStageRollbackParams) {
    return CDR.post({ url: UpdateOpportunityStageRollbackUrl, data });
  }

  // 商机阶段排序
  function sortOpportunityStage(data: string[]) {
    return CDR.post({ url: SortOpportunityStageUrl, data });
  }

  // 添加商机阶段
  function addOpportunityStage(data: AddOpportunityStageParams) {
    return CDR.post({ url: AddOpportunityStageUrl, data });
  }

  // 获取商机阶段配置
  function getOpportunityStageConfig() {
    return CDR.get<OpportunityStageConfig>({ url: GetOpportunityStageConfigUrl }, { ignoreCancelToken: true });
  }

  // 删除商机阶段
  function deleteOpportunityStage(id: string) {
    return CDR.get({ url: `${DeleteOpportunityStageUrl}/${id}` });
  }

  // 生成商机图表
  function generateOpportunityChart(data: GenerateChartParams) {
    return CDR.post<ChartResponseDataItem[]>({ url: GenerateOpportunityChartUrl, data });
  }

  // 商机视图
  function addBusinessView(data: ViewParams) {
    return CDR.post({ url: AddBusinessViewUrl, data });
  }

  function updateBusinessView(data: ViewParams) {
    return CDR.post({ url: UpdateBusinessViewUrl, data });
  }

  function getBusinessViewList() {
    return CDR.get<ViewItem[]>({ url: GetBusinessViewListUrl });
  }

  function getBusinessViewDetail(id: string) {
    return CDR.get({ url: `${GetBusinessViewDetailUrl}/${id}` });
  }

  function fixedBusinessView(id: string) {
    return CDR.get({ url: `${FixedBusinessViewUrl}/${id}` });
  }

  function enableBusinessView(id: string) {
    return CDR.get({ url: `${EnableBusinessViewUrl}/${id}` });
  }

  function deleteBusinessView(id: string) {
    return CDR.get({ url: `${DeleteBusinessViewUrl}/${id}` });
  }

  function dragBusinessView(data: TableDraggedParams) {
    return CDR.post({ url: DragBusinessViewUrl, data });
  }

  function globalSearchOptPage(data: TableQueryParams) {
    return CDR.post<CommonList<OpportunityItem>>({ url: GlobalSearchOptPageUrl, data }, { ignoreCancelToken: true });
  }

  function advancedSearchOptPage(data: TableQueryParams) {
    return CDR.post<CommonList<OpportunityItem>>({ url: AdvancedSearchOptPageUrl, data }, { ignoreCancelToken: true });
  }

  function advancedSearchOptDetail(data: TableQueryParams) {
    return CDR.post<CommonList<OpportunityItem>>({ url: AdvancedSearchOptDetailUrl, data });
  }

  function preCheckImportOpt(file: File) {
    return CDR.uploadFile<{ data: ValidateInfo }>({ url: PreCheckOptImportUrl }, { fileList: [file] }, 'file');
  }

  function downloadOptTemplate() {
    return CDR.get(
      {
        url: DownloadOptTemplateUrl,
        responseType: 'blob',
      },
      { isTransformResponse: false, isReturnNativeResponse: true }
    );
  }

  function importOpportunity(file: File) {
    return CDR.uploadFile({ url: ImportOpportunityUrl }, { fileList: [file] }, 'file');
  }

  // 批量更新商机
  function batchUpdateOpportunity(data: BatchUpdatePoolAccountParams) {
    return CDR.post({ url: BatchUpdateOpportunityUrl, data });
  }

  // 获取商机报价单tab显隐藏
  function getQuotationTab() {
    return CDR.get<CustomerTabHidden>({ url: GetQuotationTabUrl });
  }

  // 报价单视图
  function addQuotationView(data: ViewParams) {
    return CDR.post({ url: AddQuotationViewUrl, data });
  }

  function updateQuotationView(data: ViewParams) {
    return CDR.post({ url: UpdateQuotationViewUrl, data });
  }

  function getQuotationViewList() {
    return CDR.get<ViewItem[]>({ url: GetQuotationViewListUrl });
  }

  function getQuotationViewDetail(id: string) {
    return CDR.get({ url: `${GetQuotationViewDetailUrl}/${id}` });
  }

  function fixedQuotationView(id: string) {
    return CDR.get({ url: `${FixedQuotationViewUrl}/${id}` });
  }

  function enableQuotationView(id: string) {
    return CDR.get({ url: `${EnableQuotationViewUrl}/${id}` });
  }

  function deleteQuotationView(id: string) {
    return CDR.get({ url: `${DeleteQuotationViewUrl}/${id}` });
  }

  function dragQuotationView(data: TableDraggedParams) {
    return CDR.post({ url: DragQuotationViewUrl, data });
  }

  // 报价单
  // 报价列表
  function getQuotationList(data: QuotationQueryParams) {
    return CDR.post<CommonList<QuotationItem>>({ url: QuotationPageUrl, data });
  }

  // 添加报价
  function addQuotation(data: SaveQuotationParams) {
    return CDR.post({ url: AddQuotationUrl, data });
  }

  // 更新报价
  function updateQuotation(data: UpdateQuotationParams, approvalTaskId?: string) {
    return CDR.post({ url: UpdateQuotationUrl, data, params: { approvalTaskId } });
  }

  // 报价详情
  function getQuotationDetail(id: string, approvalTaskId?: string) {
    return CDR.get<QuotationItem>({ url: `${GetQuotationDetailUrl}/${id}`, params: { approvalTaskId } });
  }

  // 报价单快照详情
  function getQuotationSnapshotDetail(id: string, approvalTaskId?: string) {
    return CDR.get<QuotationItem>({ url: `${GetQuotationSnapshotDetailUrl}/${id}`, params: { approvalTaskId } });
  }

  // 获取报价表单配置
  function getQuotationFormConfig() {
    return CDR.get<FormDesignConfigDetailParams>({ url: GetQuotationFormConfigUrl });
  }

  // 获取报价表单快照配置
  function getQuotationSnapshotFormConfig(id?: string, approvalTaskId?: string) {
    return CDR.get<FormDesignConfigDetailParams>({
      url: `${GetQuotationSnapshotFormConfigUrl}/${id}`,
      params: { approvalTaskId },
    });
  }

  // 删除报价
  function deleteQuotation(id: string) {
    return CDR.get({ url: `${DeleteQuotationUrl}/${id}` });
  }

  // 作废报价
  function voidQuotation(id: string) {
    return CDR.get({ url: `${VoidQuotationUrl}/${id}` });
  }

  // 审批报价
  function approvalQuotation(data: ApproveQuotation) {
    return CDR.post({ url: ApprovalQuotationUrl, data });
  }

  // 撤销报价
  function revokeQuotation(id: string) {
    return CDR.get({ url: `${RevokeQuotationUrl}/${id}` });
  }

  function batchApprove(data: BatchUpdateQuotationStatusParams) {
    return CDR.post<BatchOperationResult>({ url: BatchApproveUrl, data });
  }

  function batchVoided(data: BatchVoidQuotationStatusParams) {
    return CDR.post<BatchOperationResult>({ url: BatchVoidedUrl, data });
  }

  function batchUpdateQuotation(data: BatchUpdatePoolAccountParams) {
    return CDR.post({ url: BatchUpdateQuotationUrl, data });
  }

  function downloadQuotation(id: string) {
    return CDR.get({ url: `${DownloadQuotationUrl}/${id}` });
  }

  return {
    getOpportunityList,
    addOpportunity,
    updateOpportunity,
    getOpportunityDetail,
    getOptFormConfig,
    getOptFollowRecordList,
    deleteOptFollowRecord,
    addOptFollowRecord,
    updateOptFollowRecord,
    getOptFollowRecord,
    getOptFollowPlanList,
    addOptFollowPlan,
    updateOptFollowPlan,
    deleteOptFollowPlan,
    getOptFollowPlan,
    cancelOptFollowPlan,
    transferOpt,
    batchDeleteOpt,
    deleteOpt,
    updateOptStage,
    getOptTab,
    getOpportunityContactList,
    updateOptFollowPlanStatus,
    exportOpportunityAll,
    exportOpportunitySelected,
    addBusinessView,
    deleteBusinessView,
    fixedBusinessView,
    getBusinessViewDetail,
    getBusinessViewList,
    updateBusinessView,
    enableBusinessView,
    dragBusinessView,
    advancedSearchOptPage,
    globalSearchOptPage,
    advancedSearchOptDetail,
    preCheckImportOpt,
    downloadOptTemplate,
    importOpportunity,
    getOptStatistic,
    batchUpdateOpportunity,
    sortOpportunity,
    updateOpportunityStage,
    updateOpportunityStageRollback,
    sortOpportunityStage,
    addOpportunityStage,
    getOpportunityStageConfig,
    deleteOpportunityStage,
    generateOpportunityChart,
    getQuotationTab,
    addQuotationView,
    deleteQuotationView,
    fixedQuotationView,
    getQuotationViewDetail,
    getQuotationViewList,
    updateQuotationView,
    enableQuotationView,
    dragQuotationView,
    getQuotationList,
    addQuotation,
    updateQuotation,
    getQuotationDetail,
    getQuotationSnapshotDetail,
    getQuotationFormConfig,
    getQuotationSnapshotFormConfig,
    deleteQuotation,
    approvalQuotation,
    voidQuotation,
    revokeQuotation,
    batchApprove,
    batchVoided,
    batchUpdateQuotation,
    downloadQuotation,
  };
}
