import { isArray, isEmpty, isNumber, isString } from 'lodash';

export function adapterTips(response: IAmapBatchResponse[]): Array<Array<IAmapTips | null>> {
  return response.map(adapterTip)
}

export function adapterTip(response: IAmapBatchResponse): Array<IAmapTips | null> {
  if (!response) return [];
  if (!response.body) return [];
  if (!Array.isArray(response.body.tips)) return [];

  return response.body.tips
    .map((tip) => {
      const adapterValue = {
        adcode: isString(tip.adcode) ? tip.adcode : '',
        address: isString(tip.address) ? tip.address : '',
        city: isString(tip.city) ? tip.city : '',
        district: isString(tip.district) ? tip.district : '',
        id: isString(tip.id) ? tip.id : '',
        location: isString(tip.location) ? tip.location : '',
        name: isString(tip.name) ? tip.name : '',
        typecode: isString(tip.typecode) ? tip.typecode : '',
      };

      if (!adapterValue.location) {
        return null;
      }

      return adapterValue;
    })
    .filter(v => !!v);
}

export function adapterAddressComponent(response: IGeoregeoResponse): IAddressComponent | null {
  if (!response) return null;
  let addressComponent = null;
  if (response.regeocode) {
    addressComponent = regeo();
  }

  if (response.geocodes) {
    addressComponent = reo();
  }

  function regeo() {
    if (!response.regeocode) return null;
    if (isString(response.regeocode.addressComponent)) return null;
    if (isArray(response.regeocode.addressComponent)) return null;
    if (isNumber(response.regeocode.addressComponent)) return null;
    if (isEmpty(response.regeocode.addressComponent)) return null;
    return response.regeocode.addressComponent as IAddressComponent;
  }

  function reo() {
    if (!isArray(response.geocodes)) return null;
    if (!response.geocodes.length) return null;
    return response.geocodes[0];
  }

  if (!addressComponent) return null;

  return {
    adcode: isString(addressComponent.adcode) ? addressComponent.adcode : '',
    building: isString(addressComponent.building) ? addressComponent.building : '',
    businessAreas: addressComponent.businessAreas,
    city: isString(addressComponent.city) ? addressComponent.city : '',
    citycode: isString(addressComponent.citycode) ? addressComponent.citycode : '',
    country: isString(addressComponent.country) ? addressComponent.country : '',
    district: isString(addressComponent.district) ? addressComponent.district : '',
    neighborhood: isString(addressComponent.neighborhood) ? addressComponent.neighborhood : '',
    province: isString(addressComponent.province) ? addressComponent.province : '',
    streetNumber: isString(addressComponent.streetNumber) ? addressComponent.streetNumber : '',
    towncode: isString(addressComponent.towncode) ? addressComponent.towncode : '',
    township: isString(addressComponent.township) ? addressComponent.township : '',
  };
}

// tslint:disable-next-line:prefer-array-literal
export function adapterDistrict(response: IDistrictResponse): Array<ILocationBaseParams | null> {
  if (!response) return [];
  if (!response.districts || !response.districts.length) {
    return [];
  }
  return response.districts.map((district) => {
    const coordinate = district.center;
    if (!isString(coordinate)) {
      return null;
    }
    const [longitude, latitude] = coordinate.split(',');

    return {
      latitude,
      longitude,
    };
  });
}
