import { compose } from 'redux';
import { connect } from 'react-redux';
import { reduxForm } from 'redux-form';

import {
  FORM_NAME,
  onSubmit,
  submit,
  change,
  getInitialData,
} from '../../redux/branches/forms/consultation';

import InitialForm from '../../components/Consultation/InitialForm/InitialForm';
import ReviewForm from '../../components/Consultation/ReviewForm/ReviewForm';
import AddToPassportForm from '../../components/Consultation/AddToPassportForm/AddToPassportForm';

import {
  selectUserUuid
} from '../../redux/branches/entities/user';

import {
  selectPatientUuid
} from '../../redux/branches/entities/patient';

import {
  selectFormValues
} from '../../redux/branches/entities/consultation';

export const mapStateToProps = state => ({
  recorder: selectUserUuid(state),
  patient: selectPatientUuid(state),
  encounter: 'consultation',
  values: selectFormValues(state)
});
export const mapDispatchToProps = () => ({});

// Compose composes functions left to right (FP)
const createFormContainer = formComponent => compose(

  // Connects form to Redux store - takes a config obj to configure the form
  reduxForm({
    form: FORM_NAME,
    pure: false,
    destroyOnUnmount: false,
    forceUnregisterOnUnmount: true, // <------ unregister fields on unmount
    submit,
    change,
  }),
  connect(mapStateToProps, mapDispatchToProps)
)(formComponent);

export const InitialFormContainer = createFormContainer(InitialForm);
export const ReviewFormContainer = createFormContainer(ReviewForm);
export const AddToPassportFormContainer = compose(

  // Connects form to Redux store - takes a config obj to configure the form
  reduxForm({
    form: FORM_NAME,
    pure: false,
    destroyOnUnmount: false,
    forceUnregisterOnUnmount: true, // <------ unregister fields on unmount
    submit,
    change,
    onSubmit
  }),
  connect(mapStateToProps, mapDispatchToProps)
)(AddToPassportForm);

InitialFormContainer.defaultProps = {
  get initialValues() {
    return getInitialData();
  },
};
InitialFormContainer.defaultProps = {
  get initialValues() {
    return getInitialData();
  },
};
InitialFormContainer.defaultProps = {
  get initialValues() {
    return getInitialData();
  },
};
