import React, {Component} from 'react';
import {Container, Row, Col, FormControl, Button, Form} from 'react-bootstrap';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import AddressDisplay from '../../common/AddressDisplay';
import { faChevronDown, faChevronRight } from '@fortawesome/free-solid-svg-icons'
import {isNonEmptyArray, isEmptyArray, isEmptyObject, isNonEmptyObject} from '../../../utils/ObjectUtils';
import {toDecimals} from '../../../utils/eth';


export default class PoolReceipt extends Component {
  constructor(props) {
    super(props);
    this.state = {setConversionFeeVisible: false, setFundingDisplayVisible: false, conversionFee: 0,
      reserves:[]
    };
  }
  
  conversionFeeUpdated = (evt) => {
    this.setState({conversionFee: evt.target.value});
  }
  
  componentWillReceiveProps(nextProps) {
      const {pool: {createPool}} = nextProps;
      if (isNonEmptyObject(createPool) && isEmptyObject(this.props.pool.createPool) && createPool.reserves.length > 0) {
        
        const reserveList = createPool.reserves.map(function(rItem){
          return Object.assign({}, rItem, {amount: 0});
        });
        this.setState({reserves: reserveList});
      }
  }
  
  componentWillMount() {
    const {pool: {relayConverterStatus}} = this.props;
    console.log(relayConverterStatus);
    const self = this;
    const converterAddress = relayConverterStatus.message.events["1"].address;
    const smartTokenAddress = relayConverterStatus.message.events.SmartTokenAdded.returnValues._smartToken;

    const convertibleTokens = relayConverterStatus.message.events.ConvertibleTokenAdded.map(function(item){
      return item.returnValues._convertibleToken;
    })
        
    self.props.fetchPoolDetails({'pool': smartTokenAddress, 'converter': converterAddress, 'reserves': convertibleTokens})

  }
    
    toggleExpandSetConversionFee = () => {
      this.setState({setConversionFeeVisible: !this.state.setConversionFeeVisible});
    }
    
    toggleExpandSetFunding = () => {
      this.setState({setFundingDisplayVisible: !this.state.setFundingDisplayVisible});
    }
    
    updateConversionFee =() => {
          const {pool: {relayConverterStatus, activationStatus, createPool}} = this.props;
      const {conversionFee} = this.state;
      const converterAddress = relayConverterStatus.message.events["1"].address;
      this.props.setConversionFee(converterAddress, conversionFee);    
    }
    
    updateTokenAmount = (amount, idx) => {
      let {reserves} = this.state;
      reserves[idx].amount = amount;
      this.setState({reserves: reserves});
    }
    
    updatePoolFunding = () => {
      const {reserves} = this.state;
          const {pool: {relayConverterStatus, activationStatus, createPool}} = this.props;
      const converterAddress = relayConverterStatus.message.events["1"].address;
      const reserveMap = reserves.map(function(item){
        return item.data.address;
      });
      const amountMap = reserves.map(function(item){
        return toDecimals(item.amount, item.data.decimals);
      });
      this.props.approveAndFundPool(reserveMap, amountMap, converterAddress);
    }
    
    openPoolTab = () => {
      const {pool: {createPool, relayConverterStatus}} = this.props;
      if (createPool && createPool.symbol) {
        var win = window.open(`https://katanapools.com/pool/view/${createPool.symbol}`, '_blank');
        win.focus();
      }
    }
    
    render() {
        const {pool: {createPool, relayConverterStatus}} = this.props;
        const {setConversionFeeVisible, setFundingDisplayVisible, conversionFee, reserves} = this.state;
        const converterAddress = relayConverterStatus.message.events["1"].address;
        const smartTokenAddress = relayConverterStatus.message.events.SmartTokenAdded.returnValues._smartToken; 

        let reserveDetails = <span/>;
        if (createPool && reserves.length > 0) {
          reserveDetails = createPool.reserves.map(function(item, idx){
            return <Col lg={4} xs={4}>
             <div className="cell-label">{item.data.symbol}</div>
             <div className="cell-data"><AddressDisplay address={item.data.address}/></div>
            </Col>
          })
        }
        
        let conversionFeeDisplay = <span/>;
        if (setConversionFeeVisible) {
          conversionFeeDisplay = (
            <Row className="set-pool-container">
              <Col lg={10} xs={10}> 
             <Form.Control type="text" placeHolder="Set pool conversion fees, maximum 3%"
             value={conversionFee} onChange={this.conversionFeeUpdated}/>
             </Col>
             <Col lg={2} xs={2}>
             <Button onClick={this.updateConversionFee}>Update</Button>
             </Col>
            </Row>
            )
        }
        
        let fundingDisplay = <span/>;
        const self = this;
        if (setFundingDisplayVisible && reserves.length > 0) {
          fundingDisplay = (
            <Row className="set-pool-container">
              {createPool.reserves.map(function(item, idx) {
                return <Col lg={12} xs={12}>
                <TokenAmountRow item={item.data} idx={idx} updateTokenAmount={self.updateTokenAmount}/>
                </Col>
              })}
             <Col lg={2} xs={2}>
             <Button onClick={this.updatePoolFunding}>Update</Button>
             </Col>
            </Row>            
            )
        }
        let transactionStatus = <span/>;
        
        return (
        <div className="create-pool-form-container app-toolbar-container">
        {transactionStatus}
        <Container>
              <div className="header">
                Congratulations !! Your pool has been deployed successfully.
              </div>
              <div>
              <Row className="sub-header">
                <Col lg={12} xs={12}>
                  Pool Details
                </Col>
              </Row>
              <Row>
                <Col lg={6}>
                  <div className="cell-label">
                  Pool Token Address
                  </div>
                  <div className="cell-data">
                  {smartTokenAddress}
                  </div>
                </Col>
                <Col lg={6}>
                  <div className="cell-label">
                  Pool Converter Address
                  </div>
                  <div className="cell-data">
                  {converterAddress}
                  </div>
                </Col>
              </Row>
              <Row>
                <Col lg={4} xs={4}>
                  <div className="cell-label">
                  Name
                  </div>
                  <div className="cell-data">
                  {createPool.name}
                  </div>
                </Col>
                <Col lg={4} xs={4}>
                <div className="cell-label">
                  Symbol
                    </div>
                 <div className="cell-data">  
                  {createPool.symbol}
                  </div>
                </Col>
                <Col lg={4} xs={4}>
                <div className="cell-label">
                  Supply
                      </div>
                      <div className="cell-data">      
                  {createPool.supply}
                   </div>
                </Col>
              </Row>
              <Row className="sub-header">
                <Col lg={12} xs={12}>
                  Pool Reserves
                </Col>
              </Row>              
              <Row>
                  {reserveDetails}
              </Row>
              
              <Row>
                <Col lg={12} className="sub-header">
                  Next steps
                </Col>
                <Col lg={12} className="app-next-step-col">
                  <div onClick={this.toggleExpandSetConversionFee}>
                    Set Pool conversion fees <FontAwesomeIcon icon={faChevronDown} />
                  </div>
                  {conversionFeeDisplay}
                </Col>
                <Col lg={12} className="app-next-step-col">
                  <div onClick={this.toggleExpandSetFunding}>
                  Add initial pool liquidity <FontAwesomeIcon icon={faChevronDown}/>
                  </div>
                  {fundingDisplay}
                </Col>
                <Col lg={12} className="app-next-step-col">
                  <div onClick={this.gotoPoolPage}>
                  View your pool <FontAwesomeIcon icon={faChevronRight} onClick={this.openPoolTab}/>
                  </div>
                </Col>
              </Row>
              </div>
              </Container>
            </div>
            )
    }
}

class TokenAmountRow extends Component {
  constructor(props) {
    super(props);
    this.state = {tokenAmount: ''};
  }
  
  tokenAmountChanged = (evt) => {
    const {idx} = this.props;
    const amount = evt.target.value;
    this.props.updateTokenAmount(amount, idx);
  }
  render() {
    const {tokenAmount} = this.props;
    const {item} = this.props;
    let tokenUSDValue = 0;
    return (
      <div>
        <Form.Group controlId="formFundingCenter" className="pool-funding-form-row">
          <Form.Label>Amount of {item.symbol} to transfer. 1 {item.symbol} = {item.price} USD.</Form.Label>
          <Form.Control type="text" placeholder="enter amount of token to transfer" value={tokenAmount}
          onChange={this.tokenAmountChanged} />
          <Form.Text className="text-muted">
            Total USD value = {tokenUSDValue}. Your wallet balance {item.senderBalance}
          </Form.Text>
        </Form.Group>
      </div>
      )
  }
}