// @ts-nocheck
import intl from 'react-intl-universal';
import * as R from 'ramda';
import { isUndefined } from 'lodash';
import { defaultFastFieldShouldUpdate } from '@/utils';

export const AccountDialogAction = {
  Edit: 'edit',
  NewChild: 'NewChild',
  NewDefinedType: 'NewDefinedType',
};

/**
 * Transformes the response API errors.
 */
export const transformApiErrors = (errors) => {
  const fields = {};
  if (errors.find((e) => e.type === 'NOT_UNIQUE_CODE')) {
    fields.code = intl.get('account_code_is_not_unique');
  }
  if (errors.find((e) => e.type === 'ACCOUNT.NAME.NOT.UNIQUE')) {
    fields.name = intl.get('account_name_is_already_used');
  }
  if (
    errors.find((e) => e.type === 'ACCOUNT_CURRENCY_NOT_SAME_PARENT_ACCOUNT')
  ) {
    fields.parent_account_id = intl.get(
      'accounts.error.account_currency_not_same_parent_account',
    );
  }
  return fields;
};

/**
 * Payload transformer in account edit mode.
 */
function tranformNewChildAccountPayload(account, payload) {
  return {
    parent_account_id: payload.parentAccountId || '',
    account_type: payload.accountType || '',
    subaccount: true,
  };
}

/**
 * Payload transformer in new account with defined type.
 */
function transformNewDefinedTypePayload(account, payload) {
  return {
    account_type: payload.accountType || '',
  };
}

/**
 * Merged the fetched account with transformed payload.
 */
const mergeWithAccount = R.curry((transformed, account) => {
  return {
    ...account,
    ...transformed,
  };
});

/**
 * Default account payload transformer.
 */
const defaultPayloadTransform = (account, payload) => ({
  subaccount: !!account.parent_account_id,
});

/**
 * Defined payload transformers.
 */
function getConditions() {
  return [
    [AccountDialogAction.Edit],
    [AccountDialogAction.NewChild, tranformNewChildAccountPayload],
    [AccountDialogAction.NewDefinedType, transformNewDefinedTypePayload],
  ];
}

/**
 * Transformes the given payload to account form initial values.
 */
export const transformAccountToForm = (account, payload) => {
  const conditions = getConditions();

  const results = conditions.map((condition) => {
    const transformer = !isUndefined(condition[1])
      ? condition[1]
      : defaultPayloadTransform;

    return [
      condition[0] === payload.action ? R.T : R.F,
      mergeWithAccount(transformer(account, payload)),
    ];
  });
  return R.cond(results)(account);
};

/**
 * Detarmines whether the for fields are disabled.
 */
export const getDisabledFormFields = (account, payload) => {
  return {
    accountType:
      payload.action === AccountDialogAction.Edit ||
      payload.action === AccountDialogAction.NewChild ||
      payload.action === AccountDialogAction.NewDefinedType,
  };
};

/**
 * Detarmines whether should update the parent account field.
 * @param newProps
 * @param oldProps
 * @returns {boolean}
 */
export const parentAccountShouldUpdate = (newProps, oldProps) => {
  return (
    newProps.formik.values.subaccount !== oldProps.formik.values.subaccount ||
    defaultFastFieldShouldUpdate(newProps, oldProps)
  );
};

/**
 * Transformes the form values to the request.
 */
export const transformFormToReq = (form) => {
  return R.compose(
    R.omit(['subaccount']),
    R.when(
      R.propSatisfies(R.equals(R.__, false), 'subaccount'),
      R.assoc(['parent_account_id'], ''),
    ),
  )(form);
};
