/**
 * 地图底部充电站信息组件
 * @邠心vbe on 2022/12/23
 */
import React from 'react';
import { Pressable, StyleSheet, View, Text, Image } from 'react-native';
import { ElevationObject } from '../../../components/Button';
import utils from '../../../utils/utils';
import { ChargeStyle } from '../../charge/Charging';
import { PageList } from '../../Router';
import ConnectType from '../../search/ConnectType';
import app from '../../../../app.json';
import TextView from '../../../components/TextView';
import SiteLabelView from '../../../components/SiteLabelView';

export default BottomSiteInfo = ({
  stationInfo = {},
  onFavorite,
  onClose,
  style=styles.stationBarView
}) => {
  const getAvailable = (type) => {
    const all = stationInfo.allConnector;
    if (all) {
      if (type == 'box') {
        return all.boxAvailable + '/' + all.boxAll;
      } else {
        return all.available + '/' + all.all;
      }
    } else {
      return '0/0';
    }
  }

  const getOperatingHours = () => {
    if (stationInfo.endlessService) {
      return "24/7";
    } else if (stationInfo.operatingHours) {
      return stationInfo.operatingHours;
    } else {
      return $t('charging.toBeUpdated');
    }
  }

  const getParkingFee = () => {
    if (stationInfo.parkingFeeFree) {
      return $t('charging.free');
    } else if (stationInfo.parkingFee) {
      return stationInfo.parkingFee;
    } else {
      return $t('charging.toBeUpdated');
    }
  }

  const toChargePage = () => {
    if (stationInfo.upcoming) {
      toastShort($t("home.upcoming"))
    } else {
      startPage(PageList.chargeDetailPage, {stationInfo: stationInfo, action: 'view', from: PageList.home});
    }
  }

  if (stationInfo.id) {
    return (
      <Pressable
        style={({pressed}) => [style, pressed ? styles.stationBarPresed : {}]}
        onPress={() => toChargePage()}>
        <View style={ui.flexcw}>
          <TextView
            ellipsizeMode='tail'
            numberOfLines={1}
            style={styles.stationTitle}>{stationInfo.name}</TextView>
          <Pressable
            style={styles.closeIcon}
            android_ripple={rippleLess}
            onPress={onClose}>
            <MaterialCommunityIcons
              name="close"
              size={22}
              color={textCancel}/>
          </Pressable>
        </View>
        <View style={{height: 4}}></View>
        <View style={ui.flexc}>
          <TextView
            style={styles.stationAddress}
            ellipsizeMode='tail'
            numberOfLines={3}>{stationInfo.address}</TextView>
          { stationInfo.upcoming
          ? <View style={[ui.center, $margin(0, 8)]}>
              <MaterialIcons
                name="upcoming"
                size={42}
                color={colorAccent}
                style={styles.upcomingIcon} />
              <TextView style={styles.upcomingText}>{$t("home.upcoming")}</TextView>
            </View>
          : <> 
            { app.modules.bookmarks &&
              <Pressable
                style={[styles.directIconView, {backgroundColor: stationInfo.favorite ? colorPrimary : colorCancel}]}
                android_ripple={rippleLess}
                onPress={onFavorite}>
                <MaterialIcons
                  name="star"
                  size={26}
                  color={colorLight}/>
              </Pressable>
            }
            <Pressable
              style={styles.directIconView}
              android_ripple={rippleLess}
              onPress={() => {
                utils.directMaps(stationInfo.latitude, stationInfo.longitude, stationInfo.address);
              }}>
              <MaterialCommunityIcons
                name="navigation-variant"
                size={25}
                color={colorLight}/>
              {/* <MaterialIcons
                name='directions'
                size={28}
                color={colorAccent}/>
              <Text style={styles.distanceText}>{stationInfo.distance}</Text> */}
            </Pressable>
          </> }
        </View>
        <View style={ui.flex}>
          <View style={styles.connectView}>
            <ConnectType {...stationInfo?.acConnector}/>
            <ConnectType {...stationInfo?.dcConnector}/>
          </View>
          <View style={styles.stationStatusView}>
            { (stationInfo.allConnector && stationInfo.allConnector.available > 0) &&
              <TextView style={[ChargeStyle.infoStatus, ChargeStyle.statusAvailable, styles.stationStatus]}>{$t("charging.statusAvailable")}</TextView>
            }
            <TextView style={[ChargeStyle.infoStatus, stationInfo.siteType == 'Public' ? ChargeStyle.statusAvailable : ChargeStyle.statusWarning, styles.siteTypes]}>{stationInfo.siteType}</TextView>
          </View>
        </View>
        { stationInfo?.labels?.length > 0 &&
          <View style={styles.siteLabelsView}>
            <Image
              style={styles.labelIcon}
              source={require('../../../images/maps/ic_marker_additional.png')}/>
            { stationInfo.labels.map((item, index) => 
              <SiteLabelView key={index} {...item}/>
            )}
          </View>
        }
        <View style={styles.divideLine}></View>
        <View style={styles.infoDetailsView}>
          <View style={ui.flex1}>
            <TextView style={styles.infoTitle}>{$t("charging.operatingHours")}</TextView>
            <View style={styles.infoView}>
              <TextView style={styles.infoText}>{getOperatingHours()}</TextView>
            </View>
          </View>
          <View style={{width: 4}}></View>
          <View style={ui.flex1}>
            <TextView style={styles.infoTitle}>{$t("charging.parkingFees")}</TextView>
            <View style={styles.infoView}>
              <TextView style={styles.infoText}>{getParkingFee()}</TextView>
            </View>
          </View>
          <View style={{width: 4}}></View>
          <View style={ui.flex1}>
            <TextView style={styles.infoTitle}>{$t("charging.additionalInfo")}</TextView>
            <View style={styles.infoView}>
              <TextView style={styles.infoText}>{stationInfo?.additionalNotes}</TextView>
            </View>
          </View>
        </View>
      </Pressable>
    );
  } else {
    return <></>;
  }
}

const styles = StyleSheet.create({
  stationBarView: {
    left: 16,
    right: 16,
    bottom: 48,
    zIndex: 10,
    borderRadius: 6,
    ...$padding(8, 16),
    position: 'absolute',
    backgroundColor: colorLight,
    ...ElevationObject(3)
  },
  stationBarPresed: {
    backgroundColor: "#F6F6F6",
    ...ElevationObject(5)
  },
  stationInfo: {
    flex: 1,
    height: 45,
    paddingLeft: 4,
    paddingRight: 8,
    justifyContent: 'space-around'
  },
  stationTitle: {
    color: '#000',
    fontSize: 17,
    fontWeight: 'bold'
  },
  stationAddress: {
    flex: 1,
    color: '#999',
    fontSize: 12
  },
  stationAvailable: {
    height: 45,
    paddingLeft: 8,
    paddingRight: 8,
    alignItems: 'center',
    justifyContent: 'space-between'
  },
  stationStatusView: {
    marginRight: 4,
    alignItems: 'center',
    flexDirection: 'row-reverse'
  },
  stationStatus: {
    fontSize: 10,
    ...$padding(2, 6)
  },
  siteTypes: {
    fontSize: 10,
    marginTop: 0,
    marginRight: 4,
    ...$padding(2, 6)
  },
  availableIcon: {
    width: 23,
    height: 23,
  },
  availableText: {
    color: textPrimary,
    fontSize: 13,
    textAlign: 'center'
  },
  directView: {
    zIndex: 1,
    height: 45,
    marginLeft: 8,
    marginRight: 4,
    alignItems: 'center',
    justifyContent: 'space-between'
  },
  distanceText: {
    color: textPrimary,
    fontSize: 12,
  },
  directIconView: {
    zIndex: 1,
    width: 42,
    height: 42,
    marginLeft: 8,
    marginRight: 4,
    borderRadius: 45,
    alignItems: 'center',
    justifyContent: 'center',
    backgroundColor: colorAccent,
    ...ElevationObject(2)
  },
  connectView: {
    flex: 1,
    paddingTop: 12,
    paddingBottom: 12,
    alignItems: 'center',
    flexDirection: 'row'
  },
  divideLine: {
    height: 1,
    backgroundColor: '#AEAEAE'
  },
  infoDetailsView: {
    flexDirection: 'row'
  },
  infoTitle: {
    color: '#000',
    fontSize: 12,
    fontWeight: 'bold',
    ...$padding(8, 0, 8)
  },
  infoView: {
    paddingBottom: 8
  },
  infoText: {
    color: '#444',
    fontSize: 10
  },
  closeIcon: {
    width: 30,
    height: 30,
    marginTop: -2,
    marginRight: -8,
    alignItems: 'center',
    justifyContent: 'center'
  },
  siteLabelsView: {
    marginBottom: 5,
    flexWrap: 'wrap',
    alignItems: 'center',
    flexDirection: 'row'
  },
  labelIcon: {
    width: 16,
    height: 16,
    marginRight: 6
  },
  upcomingIcon: {
    marginLeft: 8,
    opacity: .3
  },
  upcomingText: {
    color: colorAccent,
    fontSize: 10,
    opacity: .3,
    marginLeft: 8,
    marginTop: -3
  }
})