// https://apis.map.qq.com/ws/place/v1/search?boundary=nearby(40.040589,116.273543,1000)&keyword=公园&page_size=10&page_index=1&key=OB4BZ-D4W3U-*****
import axios from 'axios'
import { mapServerBaseUrl } from '@/common'
import mime from '@/common/utils/mime.ts'
import qs from 'qs'

const httpUtil = axios.create({
  timeout: 10000,
  baseURL: mapServerBaseUrl,
  headers: {
    Accept: mime.JSON,
  },
})

interface SearchPlaceParam {
  /**
   * 开发密钥，必填
   */
  key: string;
  /**
   * 搜索关键字（UTF-8编码，最大96字节），必填
   */
  keyword: string;
  /**
   * 格式：nearby(纬度,经度,半径[，是否自动扩大])，必填
   */
  boundary: {
    lat: number
    lng: number
    radius?: number
    auto_extend?: 0 | 1
  };
  /**
   * 是否返回子地点，如大厦停车场、出入口等取值：
   * 0 [默认]不返回、1 返回
   */
  get_subpois?: 0 | 1;
  filter?: string; // 筛选条件（分类筛选/排除分类/筛选有电话），可选
  added_fields?: string; // 附加字段，仅支持category_code，可选
  orderby?: '_distance'; // 排序方式，仅支持按距离排序，可选
  page_size?: number; // 每页条目数（1-20），默认10，可选
  page_index?: number; // 页码，默认1，可选
  output?: 'json' | 'jsonp'; // 返回格式，默认json，可选
  callback?: string; // JSONP回调函数名，可选
}

// 坐标类型
interface Location {
  lat: number; // 纬度
  lng: number; // 经度
}

// 行政区划信息类型
interface AdInfo {
  adcode: number; // 行政区划代码
  province: string; // 省份
  city: string; // 城市（省直辖县级区划返回空）
  district: string; // 区/县
}

export interface Poi {
  id: string; // POI唯一标识
  title: string; // POI名称
  address: string; // 地址
  tel: string; // 电话
  category: string; // POI分类
  category_code?: number; // 分类编码（added_fields=category_code时返回）
  type: 0 | 1 | 2 | 3 | 4; // POI类型
  location: Location; // 坐标
  _distance: number; // 直线距离（米）
  ad_info: AdInfo; // 行政区划信息
}

// 子地点类型
interface SubPoi extends Exclude<Poi, '_distance'> {
  parent_id: string; // 主地点ID
}

// 周边搜索响应类型
export interface SearchPlaceResult {
  status: number; // 状态码（0为正常）
  message: string; // 状态说明
  count: number; // 搜索结果总数（最多返回200条）
  request_id: string; // 请求唯一标识
  data: Poi[];
  sub_pois?: SubPoi[]; // 子地点列表（get_subpois=1时返回）
}

const paramsSerializer = (params: any) => {
  return qs.stringify(params, {indices: false, allowDots: true})
}

function searchPlace(params: SearchPlaceParam) {
  return httpUtil.get<SearchPlaceResult>('/ws/place/v1/search', {
    params: {
      ...params,
      boundary: `nearby(${params.boundary.lat},${params.boundary.lng},${params.boundary.radius == null || params.boundary.radius < 10 ? 1000 : params.boundary.radius},${params.boundary.auto_extend ?? 1})`,
    },
    paramsSerializer,
    responseType: 'json',
  })
    .then(res => {
      if (res.data.status !== 0) return Promise.reject({message: res.data.message})
      return res.data
    })
    .catch(err => {
      ElMessage.error(err.message)
    })
}

export default {
  searchPlace,
}
