/**
 * 通知功能页面适配器
 * @邠心vbe on 2023/08/17
 */
import { createMaterialTopTabNavigator } from '@react-navigation/material-top-tabs';
import React, { Component } from 'react';
import { StyleSheet, View } from 'react-native';
import { PageList } from '../Router';
import ListAlerts from './ListAlerts';
import ListNews from './ListNews';
import ListCampaign from './ListCampaign';
import app from '../../../app.json';
import utils from '../../utils/utils';
import apiNotification from '../../api/apiNotification';
import TextView from '../../components/TextView';
import AlertUtil from './AlertUtil';

export default class Notification extends Component {
  constructor(props) {
    super(props);
    this.state = {
      refreshing: false,
      countInfo: {},
      pageAdapter: []
    };
    this.pageAdapterAll = [{
      title: $t('notification.tabCampaign'),
      name: "Campaigns",
      component: ListCampaign
    }, {
      title: $t('notification.tabAlerts'),
      name: "Alerts",
      component: ListAlerts
    }, {
      title: AlertUtil.isPromotion ? $t('notification.tabPromotions') : $t("notification.tabArticles"),
      name: "News",
      component: ListNews
    }]
    this.pageAdapter = [{
      title: $t('notification.tabAlerts'),
      name: "Alerts",
      component: ListAlerts
    }, {
      title: AlertUtil.isPromotion ? $t('notification.tabPromotions') : $t("notification.tabArticles"),
      name: "News",
      component: ListNews
    }]
    this.tabBarStyle = {
      tabBarStyle: styles.tabStyle,
      tabBarPressColor: rippleColor,
      tabBarScrollEnabled: false,
      tabBarIndicatorStyle: styles.indicator,
      tabBarActiveTintColor: tabBarTextActive,
      tabBarInactiveTintColor: tabBarTextInactive
    }
    this.isHide = false;
  }

  componentDidMount() {
    if (app.notifications.showCampaigns && app.notifications.showArticle) {
      this.setState({
        pageAdapter: this.pageAdapterAll
      }, () => {
        setTimeout(() => {
          this.init();
        }, 300);
      });
    } else if (app.notifications.showArticle) {
      this.setState({
        pageAdapter: this.pageAdapter
      }, () => {
        setTimeout(() => {
          this.init();
        }, 300);
      });
    } else {
      this.init();
    }
    
    this.props.navigation.addListener('focus', () => {
      if (this.isHide) {
        this.isHide = false;
        this.getTotalCount();
      }
    });
    this.props.navigation.addListener('blur', () => {
      this.isHide = true;
    });
  }

  componentWillUnmount() {
    AlertUtil.release();
    //BackHandler.removeEventListener("hardwareBackPress", this.backPage)
  }

  init() {
    utils.setBackClick([this.props?.route?.name, "Campaigns", "Alerts", "Promotions"], this.backPage)
    this.getTotalCount();
    //BackHandler.addEventListener('hardwareBackPress', this.backPage)
    AlertUtil.setOnRefreshListener(() => {
      this.getTotalCount();
    })
  }

  backPage = () => {
    //const params = this.props.route.params;
    if (!this.isHide) {
      startPage(PageList.home);
      return true;
    }
  }

  getTotalCount() {
    apiNotification.getTabDotCount().then(res => {
      if (res.data) {
        this.setState({
          countInfo: res.data
        })
        AlertUtil.setBadgeCount(res.data)
      }
    }).catch(err => {
      if (res.data) {
        this.setState({
          countInfo: {}
        })
        AlertUtil.setBadgeCount()
      }
    })
  }

  getBadgeText(index) {
    let count = 0;
    switch (index) {
      case 0:
        if (app.notifications.showCampaigns) {
          count = this.state.countInfo?.campaignUnreadCount;
        } else {
          count = this.state.countInfo?.alertUnreadCount;
        }
        break;
      case 1:
        if (app.notifications.showCampaigns) {
          count = this.state.countInfo?.alertUnreadCount;
        } else {
          count = this.state.countInfo?.newsUnreadCount;
        }
        break
      case 2:
        count = this.state.countInfo?.newsUnreadCount;
        break;
    }
    if (count > 0) {
      return <TextView style={styles.badgeText}>{count}</TextView>
    } else {
      return <></>
    }
  }

  render() {
    const Tab = createMaterialTopTabNavigator();
    if (this.state.pageAdapter.length > 0) {
      return (
        <Tab.Navigator
          style={styles.container}
          screenOptions={{
            lazy: false,
            lazyPreloadDistance: 1,
            ...this.tabBarStyle
          }}
          backBehavior={() => this.backPage()}>
          { this.state.pageAdapter.map((item, index) => 
            <Tab.Screen
              key={index}
              name={item.name}
              component={item.component}
              options={{
                title: item.title,
                tabBarAllowFontScaling: false,
                tabBarBadge: () => this.getBadgeText(index)
              }}
            />
          )}
        </Tab.Navigator>
      );
    } else {
      return <ListAlerts {...this.props} showUnread={true}/>
    }
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: colorLight
  },
  tabStyle: {
    backgroundColor: app.isWhitelabel ? colorLight : colorPrimary
  },
  indicator: {
    backgroundColor: app.isWhitelabel ? colorPrimary : colorLight
  },
  badgeText: {
    width: 20,
    height: 20,
    color: textLight,
    fontSize: 10,
    marginTop: 4,
    marginRight: 8,
    borderRadius: 30,
    fontWeight: 'bold',
    alignItems: 'center',
    flexDirection: 'row',
    justifyContent: 'center',
    backgroundColor: "#FF3B30"
  }
})
