import * as moment from 'moment';
import interopDefault from '../_util/interopDefault';
import { cloneElement } from '../_util/vnode';
import { initDefaultProps } from '../_util/props-util';

import Statistic, { StatisticProps } from './Statistic';
import { formatCountdown } from './utils';

const REFRESH_INTERVAL = 1000 / 30;

function getTime(value) {
  return interopDefault(moment)(value).valueOf();
}

export default {
  name: 'AStatisticCountdown',
  props: initDefaultProps(StatisticProps, {
    prefixCls: 'ant-statistic',
    format: 'HH:mm:ss',
  }),

  data() {
    return {
      uniKey: 0,
    };
  },

  countdownId: undefined,

  mounted() {
    this.$nextTick(() => {
      this.syncTimer();
    });
  },

  updated() {
    this.$nextTick(() => {
      this.syncTimer();
    });
  },

  beforeDestroy() {
    this.stopTimer();
  },

  methods: {
    syncTimer() {
      const { value } = this.$props;
      const timestamp = getTime(value);
      if (timestamp >= Date.now()) {
        this.startTimer();
      } else {
        this.stopTimer();
      }
    },

    startTimer() {
      if (this.countdownId) {
        return;
      }
      this.countdownId = window.setInterval(() => {
        this.uniKey++;
      }, REFRESH_INTERVAL);
    },

    stopTimer() {
      const { value } = this.$props;
      if (this.countdownId) {
        clearInterval(this.countdownId);
        this.countdownId = undefined;

        const timestamp = getTime(value);
        if (timestamp < Date.now()) {
          this.$emit('finish');
        }
      }
    },

    formatCountdown(value, config) {
      const { format } = this.$props;
      return formatCountdown(value, { ...config, format });
    },

    // Countdown do not need display the timestamp
    valueRenderHtml: node =>
      cloneElement(node, {
        props: {
          title: undefined,
        },
      }),
  },

  render() {
    return (
      <Statistic
        key={this.uniKey}
        {...{
          props: {
            ...this.$props,
            valueRender: this.valueRenderHtml,
            formatter: this.formatCountdown,
          },
        }}
      />
    );
  },
};
