PowerMapSearchResult.fromJson constructor

PowerMapSearchResult.fromJson(
  1. Map<String, dynamic> json, {
  2. String lang = 'auto',
  3. String query = '',
})

Implementation

factory PowerMapSearchResult.fromJson(
  Map<String, dynamic> json, {
  String lang = 'auto',
  String query = '',
}) {
  final source = (json['_source'] ?? json) as Map<String, dynamic>;
  final coords = (source['coordinates'] ?? [0, 0]) as List<dynamic>;

  final String nameT = source['name_t']?.toString() ?? '';
  final String nameE = source['name_e']?.toString() ?? '';
  final String nameRaw = source['name']?.toString() ?? '';

  final String nameThStr = nameT.isNotEmpty ? nameT : (nameE.isNotEmpty ? nameE : nameRaw);
  final String nameEnStr = nameE.isNotEmpty ? nameE : (nameT.isNotEmpty ? nameT : nameRaw);

  final String addrT = source['address_t']?.toString() ?? '';
  final String addrE = source['address_e']?.toString() ?? '';
  final String tambonT = source['tambon_t']?.toString() ?? '';
  final String amphoeT = source['amphoe_t']?.toString() ?? '';
  final String provinceT = source['province_t']?.toString() ?? '';
  final String tambonE = source['tambon_e']?.toString() ?? '';
  final String amphoeE = source['amphoe_e']?.toString() ?? '';
  final String provinceE = source['province_e']?.toString() ?? '';

  final String constructedAddrTh = addrT.isNotEmpty
      ? addrT
      : (tambonT.isNotEmpty ? 'ต.$tambonT อ.$amphoeT จ.$provinceT'.trim() : addrE);

  final String constructedAddrEn = addrE.isNotEmpty
      ? addrE
      : (tambonE.isNotEmpty ? '$tambonE $amphoeE $provinceE'.trim() : addrT);

  final cleanLang = lang.toLowerCase();
  final hasThai = RegExp(r'[\u0E00-\u0E7F]').hasMatch(query);
  final hasEnglish = RegExp(r'[a-zA-Z]').hasMatch(query);

  final bool preferThai = (cleanLang == 'th' || (cleanLang == 'auto' && hasThai && !hasEnglish));

  final String nameStr = preferThai ? nameThStr : nameEnStr;
  final String addressStr = preferThai ? constructedAddrTh : constructedAddrEn;

  return PowerMapSearchResult(
    gid: source['gid'] is int ? source['gid'] : int.tryParse(source['gid']?.toString() ?? '0') ?? 0,
    name: nameStr,
    nameEn: nameEnStr,
    nameTh: nameThStr,
    address: addressStr,
    addressEn: constructedAddrEn,
    addressTh: constructedAddrTh,
    position: LatLng(coords[1].toDouble(), coords[0].toDouble()),
    province: provinceT.isNotEmpty ? provinceT : provinceE,
    amphoe: amphoeT.isNotEmpty ? amphoeT : amphoeE,
    tambon: tambonT.isNotEmpty ? tambonT : tambonE,
    postCode: source['post_code']?.toString() ?? '',
    rawData: source,
  );
}