import React from 'react';
import {observer, inject} from 'mobx-react';
import {
  Dialog, FlatButton, RaisedButton,
  Step,
  StepLabel,
  Stepper,
  IconButton
} from "material-ui";
import {DIALOG} from "../../../../stores/global_ui";
import schema from 'async-validator'
import AddressDetail from './Address';

@inject('appstate')
@observer
export default class AddressAdd extends React.Component {

  constructor(props) {
    super(props);
    this.props = props;
    this.state = {
      stepIndex: 0,
      finished: false,
      openedDialog: false,
      openMaps : false,
      confirmationDialog : false,
      formData: {},
      errorMessage: '',
      default:{
        is_shipment : true,
        is_default : true
      }
    };
    this.defaultState = Object.assign({}, this.state);
    this.globalUI = props.appstate.globalUI;
    this.userAddress = props.appstate.userAddress;
    this.userData = props.appstate.userData;
  }

  componentDidMount(){
    this.setState({
      stepIndex:0
    });
  }

  componentWillReceiveProps(nextProps){
    this.setState({stepIndex : 0,formData : nextProps.defaultValue, default : nextProps.defaultValue});
  }

  getStepContent(stepIndex) {

    const {mode="create", defaultValue={}} = this.props;

    switch (stepIndex) {
      case 0:
        return (
          <AddressDetail
            mode={mode}
            defaultValue={defaultValue}
            onChangeData={formData => this.setState({formData})}/>
        );
    }
  }

  handleOpen = () => {
    this.setState({confirmationDialog: true})
  };

  handleNext = () => {
    const {stepIndex} = this.state;
    if (stepIndex === 0) {

      const rules = {
        name: [
          {
            required: true,
            message: "Please fill address name"
          }
        ],
        address: [
          {
            required: true,
            message: 'Please fill address',
          }
        ],
        province_id: [
          {
            required: true,
            message: 'Please select province',
          }
        ],
        city_id: [
          {
            required: true,
            message: 'Please select city',
          }
        ],
        phone_number: [
          {
            required: true,
            message: 'Please fill phone number',
          }
        ],
        postal_code: [
          {
            required: true,
            message: 'Please fill postal code',
          }
        ],
      };

      const validator = new schema(rules);
      console.log(this.state.formData);
      validator.validate(this.state.formData, (errs, f) => {
        console.log(errs);

        if (errs) {
          this.globalUI.showNotification("Something's Wrong", errs[0].message);
        } else {
          // let regex=/^(\([0-9]{4}\)\s*|[0-9]{4}\-|\([0-9]{3}\)\s*|[0-9]{3}\-|[0-9]{11,15})([0-9]{8}|\s*)$/;
          let regex=/^(^\+62\s?|^0)(\d{3,4}-?){2}\d{3,4}$/g;
          if(this.state.formData.phone_number.match(regex)) {
            this.setState({
              stepIndex: stepIndex + 1,
            });
          }
          else{
            this.globalUI.showNotification("Phone number should be correct !");
          }
        }
      });
    }
  }

  handlePrev = () => {
    const {stepIndex} = this.state;
    if (stepIndex > 0) {
      this.setState({stepIndex: stepIndex - 1});
    }
  }

  save = () => {
    this.globalUI.hideDialog(DIALOG.ADDRESS.CREATE);
    this.globalUI.showDialogLoading();
    const {mode="create", defaultValue={}} = this.props;
    var data = this.state.formData;
    data.lat = this.userAddress.geoData.lat;
    data.long = this.userAddress.geoData.lng;
    data.geoaddress = this.userAddress.geoData.geoaddress;

    if(this.userData.role == 'store') {
      if (mode === "create") {

        this.userAddress.addAddress(data).then(res=>{
          this.globalUI.openSnackbar('Successfully add new Address');
        }).catch((err)=> {
          console.log(err);
          this.globalUI.closeLoading();
        })
      } else if (mode === "update") {
        this.userAddress.updateAddress(data).then(res=>{
          this.globalUI.openSnackbar('Successfully update Address');
        }).catch(err=>{
          console.log(err);
          this.globalUI.openSnackbar('Something Error');
        })

      }
    }
    else if(this.userData.role == 'administrator'){
      if (mode === "create") {
        this.userAddress.addAddressAdmin(this.props.id,data).then(res=>{
          this.globalUI.openSnackbar('Successfully add new Address');
        }).catch((err)=> {
          console.log(err);
          this.globalUI.closeLoading();
        })
      } else if (mode === "update") {
        this.userAddress.updateAddressAdmin(this.props.id,data).then(res=>{
          this.globalUI.openSnackbar('Successfully update Address');
        }).catch(err=>{
          console.log(err);
          this.globalUI.openSnackbar('Something Error');
        })

      }
    }

  }

  handleClose = () => {
    this.setState({confirmationDialog: false,formData : {}})
  };


  continueButton() {
    if (this.state.stepIndex === 1) {
      return (
        <RaisedButton
          label="Finish"
          primary={true}
          onClick={this.save}
        />
      );
    } else {
      return (
        <RaisedButton
          label="Next"
          primary={true}
          onClick={this.handleNext}
        />
      );
    }
  }

  openWarningDialog = ()=>{
    // this.userAddress.deletedAddress(data.id).then(res=>{
    //   this.globalUI.openSnackbar('Delete Success');
    // })
    // console.log(data);
    this.setState(
      {
      confirmationDialog :true,errorMessage:
          'Are you sure want to delete this address?'}
          )
  ;};

  deletedAddress = (data)=>{
    this.setState({confirmationDialog:false});
    this.globalUI.hideDialog(DIALOG.ADDRESS.CREATE);
    if(this.userData.role == 'store') {
      this.userAddress.deletedAddress(data.id).then(res=>{
        this.globalUI.openSnackbar('Delete success')
      });
    }
    else if(this.userData.role == 'administrator'){
      this.userAddress.deletedAddressAdmin(this.props.id,data.id).then(res=>{
        this.globalUI.openSnackbar('Delete success')
      });
    }
  };

  render() {

    const {finished, stepIndex} = this.state;
    const {mode="create", defaultValue={}} = this.props;

    const actions = [
      <RaisedButton
        label="No"
        primary={false}
        style={{marginRight: 10}}
        onClick={this.handleClose}
      />,
      <RaisedButton
        label="Yes"
        primary={true}
        style={{marginRight: 10}}
        onClick={()=>this.deletedAddress(this.state.formData)}
      />
    ];

    const title =
      <div>
        <h4 style={{
          fontSize: 26,
          marginBottom: 0,
          marginTop: 0,
          fontWeight: 500,
          color: "black"
        }}>{(mode === "create") ? "Add New" : "Update"} Address</h4>
      </div>
    ;

    return (
      <div>
        <Dialog
          title={<div>
            <div>{title}</div>
            {/*<div style={{padding: "0px 14px 0 0", marginTop: 10}}>*/}
              {/*<Stepper activeStep={stepIndex}>*/}
                {/*<Step>*/}
                  {/*<StepLabel style={{padding: "0px 14px 0px 0px", height: 52}}>Bank Account</StepLabel>*/}
                {/*</Step>*/}
                {/*/!* <Step>*/}
                  {/*<StepLabel style={{padding: "0px 0px 0px 14px", height: 52}}>Identification & Passport</StepLabel>*/}
                {/*</Step> *!/*/}
              {/*</Stepper>*/}
            {/*</div>*/}
          </div>}
          titleStyle={{paddingBottom: 10}}
          modal={false}
          actions={<div style={{marginTop: 12}}>
            <FlatButton
              label={(stepIndex === 0) ? "Cancel" : "Back"}
              style={{marginRight: 10}}
              primary={true}
              onClick={() => (stepIndex === 0) ? this.globalUI.hideDialog(DIALOG.ADDRESS.CREATE) : this.handlePrev()}
            />
            {this.continueButton()}
            {(this.state.default.is_shipment != true && this.state.default.is_default != true) ?
              <FlatButton
                label={"Delete"}
                style={{marginRight: 10}}
                primary={true}
                onClick={() => this.openWarningDialog()}
              /> : ''}
          </div>}
          autoScrollBodyContent={true}
          repositionOnUpdate={true}
          open={this.globalUI[DIALOG.ADDRESS.CREATE]}
          onRequestClose={this.handleClose}
          paperClassName={'radius6'}
          contentClassName={'marketplace-dialog-small'}
        >
          <div style={{marginTop: 20}}>
            {this.getStepContent(stepIndex)}
          </div>
        </Dialog>

        <Dialog
          title="Warning"
          actions={actions}
          modal={false}
          autoScrollBodyContent={false}
          contentStyle={{width: 350}}
          open={this.state.confirmationDialog}
          onRequestClose={() => this.handleClose()}
        >
          {this.state.errorMessage}
        </Dialog>
      </div>
    )
  }
}
