/**
 * 桥接层类型定义
 *
 * 定义统一的能力接口 IBridge，屏蔽不同运行环境（浏览器、微信小程序、uni-app WebView）的差异，
 * 让上层业务代码只需依赖此接口即可调用原生能力。
 *
 * @module bridge/types
 */

// ──────────────────────────────────────────────
// 地理位置
// ──────────────────────────────────────────────

/** 获取地理位置时的配置选项 */
export interface GetLocationOptions {
  /** 是否启用高精度模式（GPS），默认 false */
  enableHighAccuracy?: boolean
  /** 超时时间（毫秒），默认 10000 */
  timeout?: number
  /** 是否需要返回逆地理编码后的地址描述 */
  needAddress?: boolean
}

/** 地理位置坐标 */
export interface LocationResult {
  /** 纬度，范围 -90 ~ 90 */
  latitude: number
  /** 经度，范围 -180 ~ 180 */
  longitude: number
  /** 速度（m/s） */
  speed?: number
  /** 精度（米） */
  accuracy?: number
  /** 逆地理编码后的地址描述（需要 needAddress 选项） */
  address?: string
}

// ──────────────────────────────────────────────
// 扫码
// ──────────────────────────────────────────────

/** 扫码类型 */
export type ScanType = 'qr' | 'barcode' | 'all'

/** 扫码配置选项 */
export interface ScanCodeOptions {
  /** 扫码类型，默认 'all' */
  type?: ScanType
}

/** 扫码结果 */
export interface ScanCodeResult {
  /** 扫码得到的字符串内容 */
  result: string
  /** 码的类型，如 'QR_CODE'、'EAN_13' 等 */
  format?: string
  /** 字符集 */
  charset?: string
}

// ──────────────────────────────────────────────
// 地图
// ──────────────────────────────────────────────

/** 打开地图查看位置所需的参数 */
export interface OpenMapParams {
  /** 目标纬度 */
  latitude: number
  /** 目标经度 */
  longitude: number
  /** 位置名称 */
  name?: string
  /** 地址详情 */
  address?: string
  /** 缩放级别，默认 16 */
  scale?: number
}

// ──────────────────────────────────────────────
// 图片选择
// ──────────────────────────────────────────────

/** 图片来源 */
export type ImageSourceType = 'album' | 'camera'

/** 选择图片的配置选项 */
export interface ChooseImageOptions {
  /** 最多可选图片数量，默认 1 */
  count?: number
  /** 图片来源，默认 ['album', 'camera'] */
  sourceType?: ImageSourceType[]
  /** 是否允许压缩，默认 true */
  compress?: boolean
}

/** 选择图片的返回结果 */
export interface ChooseImageResult {
  /** 选中图片的临时文件路径列表 */
  tempFilePaths: string[]
  /** 选中图片的临时文件对象列表 */
  tempFiles?: Array<{
    path: string
    size: number
  }>
}

// ──────────────────────────────────────────────
// 设备信息
// ──────────────────────────────────────────────

/** 设备信息 */
export interface DeviceInfo {
  /** 操作系统平台，如 'ios'、'android'、'windows'、'mac' */
  platform: string
  /** 设备型号 */
  model: string
  /** 操作系统版本号 */
  version: string
  /** 系统语言 */
  language?: string
  /** 设备像素比 */
  pixelRatio?: number
  /** 屏幕宽度（px） */
  screenWidth?: number
  /** 屏幕高度（px） */
  screenHeight?: number
  /** 窗口宽度（px） */
  windowWidth?: number
  /** 窗口高度（px） */
  windowHeight?: number
}

// ──────────────────────────────────────────────
// Bridge 接口 —— 所有提供者需实现此接口
// ──────────────────────────────────────────────

/**
 * 统一桥接接口
 *
 * 所有环境提供者（浏览器、微信小程序 WebView、uni-app WebView）
 * 都必须实现此接口，确保上层业务代码不感知底层差异。
 */
export interface IBridge {
  /**
   * 获取当前地理位置
   * @param options - 配置选项
   * @returns Promise 返回位置信息
   */
  getLocation(options?: GetLocationOptions): Promise<LocationResult>

  /**
   * 调起扫码
   * @param options - 扫码配置
   * @returns Promise 返回扫码结果
   */
  scanCode(options?: ScanCodeOptions): Promise<ScanCodeResult>

  /**
   * 打开地图查看指定位置
   * @param params - 目标位置参数
   * @returns Promise 返回是否成功打开
   */
  openMap(params: OpenMapParams): Promise<boolean>

  /**
   * 从相册或相机选择图片
   * @param options - 选择配置
   * @returns Promise 返回选中图片信息
   */
  chooseImage(options?: ChooseImageOptions): Promise<ChooseImageResult>

  /**
   * 获取设备信息
   * @returns Promise 返回设备信息
   */
  getDeviceInfo(): Promise<DeviceInfo>

  /**
   * 设置页面标题
   * @param title - 标题文本
   * @returns Promise 返回是否设置成功
   */
  setTitle(title: string): Promise<boolean>
}
