import React, { Component, PropTypes } from 'react';
import { AccountSummary } from 'catalyst-ui';

export default class AccountSummaryProv extends Component {
  constructor() {
    super(...arguments);

    this.fetch = this.fetch.bind(this);
    this.invalidate = this.invalidate.bind(this);
  }

  componentDidMount() {
    const { accountSummary } = this.props;

    if (!accountSummary || (accountSummary.lastAction && accountSummary.lastAction.status === 'error') || !accountSummary.data) {
      this.fetch();
    }
  }

  fetch() {
    const requestParams = {
      url: __STUDENT_ACCOUNT_URL__,
      auth: [__USERNAME__, __PASSWORD__],
    };

    this.props.fetch(requestParams);
  }

  invalidate() {
    const requestParams = {
      url: __STUDENT_ACCOUNT_URL__,
      auth: [__USERNAME__, __PASSWORD__],
    };

    this.props.invalidate(requestParams);
  }
  /**
   * Filters the balances array and sums the balances which due date past or equal to the DueNow variable plus today's date
   * @return {string} of the Due Now balance
   */
  getDueNow(balances) {
    // Get today's date
    let today = new Date();
    // Add the number of days in the future variable to today to calculate the due Now date.
    let dueDate = today.setDate(today.getDate() + parseInt(__DUE_NOW_DAYS__));
    // Filter the balances with due dates that are equal to or sooner/past the due now date.
    let itemSummaryArray = [];
    if (!Array.isArray(balances.itemSummary)) {
      itemSummaryArray.push(balances.itemSummary );
    } else {
      itemSummaryArray = balances.itemSummary;
    }

    let dueNowBalances = itemSummaryArray.filter((item)=>Date.parse(item.dueDt)<=dueDate);
    // Sum the balances and convert to a string
    let dueNow = dueNowBalances.length <= 0 ? 0 : dueNowBalances.map((item)=>parseFloat(item.ssfBalance)).reduce((a, b)=>a + b);
    // Convert and return due now balance as a string
    return dueNow.toString();
  }

  getDueFuture(balances) {
    // Get today's date
    let today = new Date();
    // Add the number of days in the future variable to today to calculate the due Now date.
    let dueDate = today.setDate(today.getDate() + parseInt(__DUE_NOW_DAYS__));
    // Filter the balances with due dates that are equal to or sooner/past the due now date.
    let itemSummaryArray = [];
    if (!Array.isArray(balances.itemSummary)) {
      itemSummaryArray.push(balances.itemSummary );
    } else {
      itemSummaryArray = balances.itemSummary;
    }


    let dueNowBalances = itemSummaryArray.filter((item)=>Date.parse(item.dueDt)>dueDate);
    // Sum the balances and convert to a string
    let dueNow = dueNowBalances.length <= 0 ? 0 : dueNowBalances.map((item)=>parseFloat(item.ssfBalance)).reduce((a, b)=>a + b);
    // Convert and return due now balance as a string
    return dueNow.toString();
  }


  render() {
    const data = this.props.summary;
    var props = {};

    props.isFetching = data.isFetching;
    props.InfoText = 'This account summary provides a snapshot of a student\'s account. \"You Owe\" reflects all unpaid charges for all terms, including future terms. \"Due Now\" reflects any past due charge plus any charge due within ' + __DUE_NOW_DAYS__ + ' days. \"Future Due\" are charges due more than ' + __DUE_NOW_DAYS__ + ' days in the future. Use the \"ACCOUNT INQUIRY\" button to view transaction details.';


    if(data.faultMessages){
      props.Fault = data.faultMessages;
    }
    if (data.data && data.data.ssfGetStudentAcctResp && data.data.ssfGetStudentAcctResp.studentAccountSummary){
      let accountsummary = data.data.ssfGetStudentAcctResp.studentAccountSummary;
      let BalanceView = accountsummary.studentAccountView[0];
      let PaymentView = accountsummary.studentAccountView[1];
      // let AidView = accountsummary.studentAccountView[2];

      props.AccountBalance = accountsummary.ssfOverallActbal;
      if(accountsummary.ssfMsgLong !== ''){
        props.AccountBalanceAltMsg = accountsummary.ssfMsgLong;
      }
      if(BalanceView){
        // props.DueNowBalance = BalanceView.ssfVwTotalBal === '0'? BalanceView.ssfVwTotalBal : this.getDueNow(BalanceView);
        props.DueNowBalance = BalanceView.ssfVwTotalBal === '0'? BalanceView.ssfVwTotalBal : this.getDueNow(BalanceView);
        props.DueNowBalanceAltMsg = BalanceView.ssfMsgLong;
        // props.FutureBalance = BalanceView.ssfVwTotalBal === '0'? BalanceView.ssfVwTotalBal : this.getDueFuture(BalanceView);
        props.FutureBalance = BalanceView.ssfVwTotalBal === '0'? BalanceView.ssfVwTotalBal : this.getDueFuture(BalanceView);
        props.FutureBalanceAltMsg = BalanceView.ssfMsgLong;
      }
      if (PaymentView) {
        if (PaymentView.ssfMsgLong !== '') {
          props.LastPaymentAltMsg = PaymentView.ssfMsgLong;
        }

        let paymentItemSummary = [];
        if (!Array.isArray(PaymentView.itemSummary)) {
          paymentItemSummary.push(PaymentView.itemSummary);
        } else {
          paymentItemSummary = PaymentView.itemSummary;
        }

        props.LastPayment = PaymentView.ssfVwTotalAmt === '0' ? PaymentView.ssfVwTotalBal : paymentItemSummary[0].ssfAmount;
        if (PaymentView.itemSummary) {
          props.LastPaymentDate = paymentItemSummary[0].postedDate;
        }
      }
      // if(AidView){
        // if(AidView.ssfMsgLong !== ''){
        //   props.PendingFinancialAltMsg = AidView.ssfMsgLong;
        // }
      //   props.PendingFinancialAid = AidView.ssfVwTotalAmt;
      // }

      props.AccountInquiryUrl=__ACCOUNTINQUIRY_URL__;
      props.MakePaymentUrl=__MAKEPAYMENT_URL__;
      props.TermBillUrl=__TERMBILL_URL__;
      props.PendingFinancialAidUrl=__PENDING_FINANCIAL_AID_URL__;
    }
    return (
      <AccountSummary {...props} />
    );
  }
}

AccountSummaryProv.propTypes = {
  summary: PropTypes.object,
  fetch: PropTypes.func.isRequired,
  invalidate: PropTypes.func.isRequired,
};
