import axios, { AxiosInstance } from "axios";

// API配置
const API_CONFIG = {
  // 内网URL
  INTERNAL_URL:
    "http://10.1.5.118:8077/platform-api/api/his-web/self-service-machine/",
  // 外网URL
  EXTERNAL_URL:
    "http://apihis.circleharmonyhospital.cn:8982/platform-api/api/his-web/self-service-machine/",
};

// 响应数据类型
export interface ApiResponse<T = any> {
  Status: number;
  Message: string | null;
  Data: T;
  CopyRight: string;
}

// 患者基本信息
export interface PatientInfo {
  name: string;
  gender: number;
  gender_name: string;
  age: string;
  IdCard: string;
  phone: string;
  marital: number;
  marital_name: string;
}

// VIP认证结果
export interface VipResult {
  is_vip: number; // 0-否 1-是
}

// 可选项目列表 - 套餐信息
export interface PackageInfo {
  physical_exam_id: number;
  is_optional_package: number;
  is_optional_package_name: string;
  package_code: number;
  package_name: string;
  registration_time: string;
}

// 可选项目
export interface OptionalItem {
  combination_name: string;
  combination_code: number;
  physical_exam_id: number;
  package_code: number;
}

// 可选项目列表响应
export interface OptionalItemListResponse {
  packageInfo: PackageInfo;
  listOptionalItem: OptionalItem[];
}

// 已预约套餐信息
export interface PackagItemInfo {
  patient_name: string;
  appointment_datetime: string;
  package_code: number;
  package_name: string;
  registration_time: string;
}

// 套餐详情
export interface PackDetail {
  department_id: number;
  department_name: string;
  project_id: string;
  project_name: string;
}

// 已预约套餐详情响应
export interface PackagItemDetailResponse {
  packagItemInfo: PackagItemInfo;
  listPackDetail: PackDetail[];
}

// PDF响应
export interface PdfResponse {
  list_pdf_url: string[];
  message: string | null;
}

export interface SignPdfResponse {
  pdf_url: string;
  message: string | null;
}

export interface DaojiandanPdfResponse {
  exam_id: number;
  pdf_url: string;
  message: string | null;
}

// 解析后的PDF响应（接口8返回的pdf_url可能是JSON字符串）
export interface ParsedPdfResponse {
  pdfUrl: string;
  message: string;
}

// 创建axios实例
function createAxiosInstance(baseURL: string): AxiosInstance {
  const instance = axios.create({
    baseURL,
    timeout: 30000, // 30秒超时
    headers: {
      "Content-Type": "application/json; charset=UTF-8",
    },
  });

  // 请求拦截器
  instance.interceptors.request.use(
    (config) => {
      return config;
    },
    (error) => {
      return Promise.reject(error);
    }
  );

  // 响应拦截器
  instance.interceptors.response.use(
    (response) => {
      return response;
    },
    (error) => {
      return Promise.reject(error);
    }
  );

  return instance;
}

// 默认使用外网URL，可以通过环境变量或配置切换
let currentBaseURL = API_CONFIG.EXTERNAL_URL;
let axiosInstance = createAxiosInstance(currentBaseURL);

/**
 * 设置API基础URL
 * @param useInternal 是否使用内网URL
 */
export function setApiBaseUrl(useInternal: boolean = false) {
  currentBaseURL = useInternal
    ? API_CONFIG.INTERNAL_URL
    : API_CONFIG.EXTERNAL_URL;
  axiosInstance = createAxiosInstance(currentBaseURL);
}

/**
 * 1. 通过身份证号查询基本信息
 */
export async function getPatientInfo(
  id_no: string
): Promise<ApiResponse<PatientInfo>> {
  const response = await axiosInstance.post<ApiResponse<PatientInfo>>(
    "patient-info",
    {
      id_no,
    }
  );
  return response.data;
}

/**
 * 2. 获取VIP客户认证结果
 */
export async function getVipStatus(
  id_no: string
): Promise<ApiResponse<VipResult>> {
  const response = await axiosInstance.post<ApiResponse<VipResult>>(
    "is-taiping-vip",
    {
      id_no,
    }
  );
  return response.data;
}

/**
 * 3. 通过身份证号获取体检选项项目列表
 */
export async function getOptionalItemList(
  id_no: string
): Promise<ApiResponse<OptionalItemListResponse>> {
  const response = await axiosInstance.post<
    ApiResponse<OptionalItemListResponse>
  >("optional-item-list", {
    id_no,
  });
  return response.data;
}

/**
 * 4. 查询已预约的体检套餐详情
 * 注意：此接口与接口3使用相同的路径，但返回数据不同
 * 如果后端需要区分，可能需要额外的参数或不同的路径
 */
export async function getPackagItemDetail(
  id_no: string
): Promise<ApiResponse<PackagItemDetailResponse>> {
  const response = await axiosInstance.post<
    ApiResponse<PackagItemDetailResponse>
  >("package-item-list", {
    id_no,
  });
  return response.data;
}

/**
 * 5. 获取体检知情同意书PDFurlList
 */
export async function getTongyishuPdf(
  exam_id: number
): Promise<ApiResponse<PdfResponse>> {
  const response = await axiosInstance.post<ApiResponse<PdfResponse>>(
    "tongyishu-get",
    {
      exam_id,
    }
  );
  return response.data;
}

/**
 * 5.5. 拿取体检知情同意书PDF
 */
export async function getTongyishuPdfFile(
  pdf_url: string
): Promise<ApiResponse<PdfResponse>> {
  const response = await axiosInstance.get<ApiResponse<PdfResponse>>(pdf_url);
  return response.data;
}
/**
 * 6. 体检知情同意书签名，返回生成的知情同意书PDF
 * @param exam_id 体检ID
 * @param sign_file 签名图片文件（File对象或Blob）
 */
export async function submitTongyishuSign(
  exam_id: number,
  sign_file: File | Blob
): Promise<ApiResponse<PdfResponse>> {
  const formData = new FormData();
  formData.append("exam_id", exam_id.toString());
  formData.append("sign_file", sign_file);

  const response = await axiosInstance.post<ApiResponse<PdfResponse>>(
    "tongyishu-sign-submit",
    formData,
    {
      headers: {
        "Content-Type": "multipart/form-data",
      },
    }
  );
  return response.data;
}

/**
 * 7. 获取体检导检单PDF
 */
export async function getDaojiandanPdf(
  exam_id: number
): Promise<ApiResponse<DaojiandanPdfResponse>> {
  const response = await axiosInstance.post<ApiResponse<DaojiandanPdfResponse>>(
    "daojiandan-get",
    {
      exam_id,
    }
  );
  return response.data;
}

/**
 * 8. 提交体检导检单签名，返回生成的导检单PDF
 * @param exam_id 体检ID
 * @param sign_file 签名图片文件（File对象或Blob）
 * @returns 注意：返回的Data.pdf_url可能是JSON字符串，需要解析
 */
export async function submitDaojiandanSign(
  exam_id: number,
  sign_file: File | Blob
): Promise<ApiResponse<SignPdfResponse>> {
  const formData = new FormData();
  formData.append("exam_id", exam_id.toString());
  formData.append("sign_file", sign_file);

  const response = await axiosInstance.post<ApiResponse<SignPdfResponse>>(
    "daojiandan-sign-submit",
    formData,
    {
      headers: {
        "Content-Type": "multipart/form-data",
      },
    }
  );
  return response.data;
}

/**
 * 解析接口8返回的pdf_url JSON字符串
 * @param pdfUrlJsonString JSON字符串
 * @returns 解析后的PDF响应对象
 */
export function parsePdfUrlResponse(
  pdfUrlJsonString: string
): ParsedPdfResponse {
  try {
    return JSON.parse(pdfUrlJsonString);
  } catch (error) {
    // 如果不是JSON字符串，直接返回
    return {
      pdfUrl: pdfUrlJsonString,
      message: "",
    };
  }
}

// 导出axios实例，以便需要时进行自定义配置
export { axiosInstance };
