declare namespace T {
  class TransitRoute {
    /** 创建一个公交导航实例，用于获取公交路线规划方案*/
    constructor(map: Map, opts: TransitRouteOptions);

    /** 发起检索 */
    search(start: LngLat, end: LngLat): void;

    /** 返回最近一次检索的结果 */
    getResults(): TransitRouteResult;

    /** 清除最近一次检索的结果 */
    clearResults(): void;

    /** 设置路线规划策略，参数为策略常量 */
    setPolicy(policy: TransitRouteOptions["policy"]): void;

    /** 设置检索结束后的回调函数 */
    setSearchCompleteCallback(fun: Exclude<TransitRouteOptions["onSearchComplete"], undefined>): void;

    /** 返回状态码 */
    getStatus(): TransitRouteResult["resultCode"];
  }

  interface TransitRouteOptions {
    /**
     * 公交导航的策略参数。
     * TMAP_TRANSIT_POLICY_LEAST_TIME = 1表示最少时间
     * TMAP_TRANSIT_POLICY_LEAST_TRANSFER = 2表示最少换乘
     * TMAP_TRANSIT_POLICY_LEAST_WALKING = 4表示最少步行
     * TMAP_TRANSIT_POLICY_AVOID_SUBWAYS = 8表示不乘地铁
     */
    policy: number;
    /** 检索结束后的回调函数 */
    onSearchComplete?: (result: TransitRouteResult) => void;
  }

  interface TransitRouteResult {
    /** 是否包含地铁 */
    hasSubway: boolean;
    /**
     * 返回状态码。状态码如下：
     * 0表示正常返回线路；
     * 1表示找不到起点；
     * 2表示找不到终点；
     * 3表示规划不出线路；
     * 4表示起终点距离200米以内，不返回线路；
     * 5表示起终点距离500米内，返回线路；
     * 6表示输入参数错误
     */
    resultCode: number;
    results: {
      lineType: TransitRouteOptions["policy"];
      lines: {
        /** 方案线路名称 */
        lineName: string;
        segments: {
          segmentType: number;
          segmentLine: SegmentLine;
          stationStart: Station;
          stationEnd: Station;
        }[];
      }[];
    };

    /** 返回方案个数 */
    getNumPlans(): number;

    /** 返回索引指定的方案。索引0表示第一条方案 */
    getPlan(i: number): TransitRoutePlan;
  }

  interface TransitRoutePlan {
    Distance: number;
    Duration: number;
    LineName: string;
    LineType: number;
    NumSegments: number;

    /** 返回单个方案的详细信息段数 */
    getNumSegments(): number;

    /** 返回索引指定的详细信息。索引0表示第一条方案 */
    getDetails(i: number): TransitRouteLine;

    /** 返回方案描述文本 */
    getLineName(): string[];

    /** 返回方案总距离 */
    getDistance(): number;

    /** 返回方案总时间 */
    getDuration(): number;

    /** 返回公交导航的策略参数 */
    getLineType(): number;
  }

  interface TransitRouteLine {
    /**
     * 返回线路类型
     * 1表示步行；
     * 2表示公交；
     * 3表示地铁；
     * 4表示地铁站内换乘
     */
    getSegmentType(): number;

    /** 返回起站点信息 */
    getStationStart(): Station;

    /** 返回终站点信息 */
    getStationEnd(): Station;

    /** 返回线路内容 */
    getSegmentLine(): SegmentLine;
  }

  interface Station {
    /** 起终站点坐标 "lng,lat" */
    lonlat: string;
    /** 起终站点名称 */
    name: string;
    /** 起终站点id */
    uuid: string;
  }

  type SegmentLine = {
    /** 此段线路需要经过的站点数 */
    segmentStationCount: number;
    /** 此段线路需要的时间 */
    segmentTime: number;
    /** 此段线路的距离 */
    segmentDistance: number;
    /** 此段线路的完整线路名 */
    direction: string;
    /** 此段线路的坐标 "lng,lat;lng,lat;lng,lat" */
    linePoint: string;
    /** 线路名称 */
    lineName: string;
    /** 此段线路id */
    byuuid: string;
  }[];
}
