//ios Certificates key : rentchatYs962816

// twilio
// FRIENDLY NAME : rentchat
// SID : SKd9452f332bc79084af9b03b8098c18cd
// KEY TYPE : Standard
// SECRET : ImrUyVKfoQqGxC7xuBbhCcIfCePBIlU0
import React, {Component} from 'react';
import {StatusBar, Platform, Text, TextInput} from 'react-native';
import {
  SafeAreaView,
  createStackNavigator,
  createAppContainer,
} from 'react-navigation';
import Router from './src/router';
import JMessage from 'jmessage-react-plugin';
import {colors} from './src/assets/styles/colors-theme';
import {handleNavigationChange} from './src/common/history';
import LoadingView from './src/common/loading';
import {Provider, observer} from 'mobx-react';
import NavigationService from './src/services/NavigationService';
import JPush from 'jpush-react-native';
import stores from './src/store';
import {
  checkNotifications,
  requestNotifications,
} from 'react-native-permissions';
//import * as stores from './src/stores/index';
import {handleErrors} from './src/common/global-error-handler';
import Event from './src/common/event';
import PushService from './src/common/PushService';
import NotifService from './src/common/NotifService';

@observer
export default class App extends Component {
  constructor(props) {
    super(props);
    Text.defaultProps = Text.defaultProps || {};
    TextInput.defaultProps = TextInput.defaultProps || {};
    // Ignore dynamic type scaling on iOS
    Text.defaultProps.allowFontScaling = false;
    TextInput.defaultProps.allowFontScaling = false;
    this.timer = null;
    this.state = {
      loadingCount: 0,
    };
    //this.notif = new NotifService(this.onRegister.bind(this));
    // require('promise/setimmediate/rejection-tracking').enable({
    //   allRejections: true,
    //   onUnhandled: (id, error) => {
    //     handleErrors(error);
    //   }
    // })

    // this._handleGlobalError = this.handleGlobalError.bind(this)
    // this._handleShowLoading = this.handleShowLoading.bind(this)
    // this._handleHideLoading = this.handleHideLoading.bind(this)
  }

  checkPermission() {
    checkNotifications().then(({status, settings}) => {
      console.log(status);
      if (status == 'DENIED') {
        this.requestNotifications();
      }
    });
  }
  requestNotifications() {
    requestNotifications([
      'alert',
      'sound',
      'badge',
    ]).then(({status, settings}) => {});
  }

  async componentWillMount() {}

  notificationClickAction(data) {
    console.log(data);
    if (data.hasOwnProperty('extras')) {
      console.log('oh...');
      if (data.extras.hasOwnProperty('_j_type')) {
        if (data.extras._j_type == 'jmessage') {
          if (data.notificationEventType == 'notificationOpened') {
            console.log(data.extras.custom.id);
            console.log(data.extras.custom.type);
            console.log(data.extras.custom.nickname);
            if (data.extras.custom.type == 'group') {
              var data = {
                id: data.extras.custom.id,
                type: 'group',
                nickname: 'Helper',
              };
              try {
                NavigationService.navigate('chat', {conversation: data});
              } catch (error) {
                console.log(error);
              }
            } else {
              var data = {
                username: data.extras.custom.id,
                type: 'single',
                nickname: data.extras.custom.nickname,
              };
              try {
                NavigationService.navigate('chat', {conversation: data});
              } catch (error) {
                console.log(error);
              }
            }
          }
        }
      }
    }
  }

  async componentDidMount() {
    await this.checkPermission();
    var params = {
      appkey: '89d24c00f8f896623e0bccef',
      isOpenMessageRoaming: false,
      isProduction: true,
      channel: '',
    };
    await JMessage.init(params);
    await JPush.init();
    JMessage.getUserInfo(
      {
        username: '4dbc5b294f184772a043573d7ad9b8c8',
        appKey: '89d24c00f8f896623e0bccef',
      },
      userInfo => {
        // do something.
        console.log(userInfo);
      },
      error => {
        var code = error.code;
        var desc = error.description;
      },
    );
    JMessage.setDebugMode({enable: false});
    JMessage.setBadge(0, success => {});
    JMessage.getMyInfo(myInfo => {
      if (myInfo.username) {
      } else {
        console.log(myInfo);
      }
    });
    JMessage.addSyncOfflineMessageListener(message => {
      console.log(
        '| JIGUANG |===addSyncOfflineMessageListener====' +
          JSON.stringify(message),
      );
    });

    this.connectListener = result => {
      console.log('connectListener:' + JSON.stringify(result));
    };

    JPush.addNotificationListener(result => {
      console.log(`notificationListener: ${JSON.stringify(result)}`);
      this.notificationClickAction(result);
    });
    JPush.addCustomMessagegListener(result => {
      console.log(`customMessageListener: ${JSON.stringify(result)}`);
    });
    //PushService.configure()
    // 监听全局报错
    // Event.listen('GLOBAL_ERROR', this._handleGlobalError, this)

    // 显示加载动画
    // Event.listen('SHOW_LOADING', this._handleShowLoading, this)

    // 隐藏加载动画
    // Event.listen('HIDE_LOADING', this._handleHideLoading, this)
  }

  //组件卸载之前移除监听
  componentWillUnmount() {
    // Event.remove('GLOBAL_ERROR', this)
    //Event.remove('SHOW_LOADING', this)
    // Event.remove('HIDE_LOADING', this)
    // JPush.removeListener(result => {
    //   console.log(`remove listener: ${JSON.stringify(result)}`);
    // });
  }

  onRegister(token) {
    console.log(token);
  }

  onNotif(notif) {
    console.log(notif);
  }
  render() {
    return (
      <Provider {...stores}>
        <SafeAreaView
          style={{flex: 1, backgroundColor: colors.mainColor}}
          forceInset={{
            top: 'always',
            bottom: 'always',
          }}>
          <StatusBar
            animated={true}
            barStyle={'light-content'}
            backgroundColor={colors.mainColor}
            translucent={true}
          />
          <Router
            onNavigationStateChange={handleNavigationChange}
            ref={navigatorRef => {
              NavigationService.setTopLevelNavigator(navigatorRef);
            }}
          />
          <LoadingView visible={this.state.loadingCount > 0} />
        </SafeAreaView>
      </Provider>
    );
  }

  /**
   * showLoading
   */
  handleShowLoading() {
    if (this.timer) {
      clearTimeout(this.timer);
    }

    this.timer = setTimeout(() => {
      this.setState({
        loadingCount: this.state.loadingCount + 1,
      });
    }, 50);
  }

  /**
   * hideLoading
   * @param bForece
   */
  handleHideLoading(bForece) {
    if (this.timer) {
      clearTimeout(this.timer);
    }

    this.timer = setTimeout(() => {
      if (this.state.loadingCount > 0) {
        this.setState({
          loadingCount: bForece ? 0 : this.state.loadingCount - 1,
        });
      }
    }, 50);
  }
}
