const fetchMachine = Machine({
  id: 'fetch',
  initial: 'unverified',
  context: {
    smsBlockVisible: false,
    verifyCodeButtonDisabled: true,
    phoneNumberInputReadOnly: false,
    sendCodeButtonVisible: true,
    unlinkPhoneButtonVisible: false,
    successMessage: 'undefined',
    errorMessage: 'undefined',
    showSpinner: false,
  },
  states: {
    unverified: {
      on: {
        SEND_CODE: {
          target: 'sms_code_sending',
          actions: assign({
            smsBlockVisible: false,
            verifyCodeButtonDisabled: false,
            phoneNumberInputReadOnly: true,
            sendCodeButtonVisible: false,
            unlinkPhoneButtonVisible: false,
            successMessage: 'undefined',
            errorMessage: 'undefined',
            showSpinner: true,
          }),
        },
        CONFIRM_PHONE: {
          target: 'verified',
          actions: assign({
            smsBlockVisible: false,
            verifyCodeButtonDisabled: true,
            phoneNumberInputReadOnly: true,
            sendCodeButtonVisible: false,
            unlinkPhoneButtonVisible: true,
            successMessage: 'undefined',
            errorMessage: 'undefined',
            showSpinner: false,
          }),
        },
      },
    },
    sms_code_sending: {
      on: {
        CODE_SENT_SUCCESS: {
          target: 'waiting_for_code_verification',
          actions: assign({
            smsBlockVisible: true,
            verifyCodeButtonDisabled: false,
            phoneNumberInputReadOnly: false,
            sendCodeButtonVisible: false,
            unlinkPhoneButtonVisible: false,
            successMessage: 'undefined',
            errorMessage: 'undefined',
            showSpinner: false,
          }),
        },
        CODE_SENT_ERROR: {
          target: 'unverified',
          actions: assign({
            smsBlockVisible: false,
            verifyCodeButtonDisabled: true,
            phoneNumberInputReadOnly: false,
            sendCodeButtonVisible: true,
            unlinkPhoneButtonVisible: false,
            successMessage: 'undefined',
            errorMessage: 'errorMessage',
            showSpinner: false,
          }),
        },
      },
    },

    waiting_for_code_verification: {
      on: {
        CHANGE_PHONE: {
          target: 'unverified',
          actions: assign({
            smsBlockVisible: false,
            verifyCodeButtonDisabled: false,
            phoneNumberInputReadOnly: false,
            sendCodeButtonVisible: true,
            unlinkPhoneButtonVisible: false,
            showSpinner: false,
          }),
        },
        VERIFY_CODE: {
          target: 'sms_code_verifying',
          actions: assign({
            smsBlockVisible: true,
            verifyCodeButtonDisabled: true,
            phoneNumberInputReadOnly: true,
            sendCodeButtonVisible: false,
            unlinkPhoneButtonVisible: false,
            showSpinner: true,
          }),
        },
      },
    },
    sms_code_verifying: {
      on: {
        CODE_VERIFIED_SUCCESS: {
          target: 'verified',
          actions: assign({
            smsBlockVisible: false,
            verifyCodeButtonDisabled: true,
            phoneNumberInputReadOnly: true,
            sendCodeButtonVisible: false,
            unlinkPhoneButtonVisible: true,
            successMessage: 'Вы успешно подтвердили телефон',
            errorMessage: 'undefined',
            showSpinner: false,
          }),
        },
        CODE_VERIFIED_ERROR: {
          target: 'waiting_for_code_verification',
          actions: assign({
            smsBlockVisible: true,
            verifyCodeButtonDisabled: false,
            phoneNumberInputReadOnly: false,
            sendCodeButtonVisible: true,
            unlinkPhoneButtonVisible: false,
            successMessage: 'undefined',
            errorMessage: 'errorMessage',
            showSpinner: false,
          }),
        },
      },
    },
    verified: {
      on: {
        UNLINK_PHONE: {
          target: 'phone_unlinking',
          actions: assign({
            smsBlockVisible: false,
            verifyCodeButtonDisabled: true,
            phoneNumberInputReadOnly: true,
            sendCodeButtonVisible: false,
            unlinkPhoneButtonVisible: false,
            successMessage: 'undefined',
            errorMessage: 'undefined',
            showSpinner: true,
          }),
        },
      },
    },
    phone_unlinking: {
      on: {
        PHONE_UNLINKED_SUCCESS: {
          target: 'unverified',
          actions: assign({
            smsBlockVisible: false,
            verifyCodeButtonDisabled: false,
            phoneNumberInputReadOnly: false,
            sendCodeButtonVisible: true,
            unlinkPhoneButtonVisible: false,
            successMessage: 'Номер телефона успешно отвязан',
            errorMessage: 'undefined',
            showSpinner: false,
          }),
        },
        PHONE_UNLINKED_ERROR: {
          target: 'verified',
          actions: assign({
            smsBlockVisible: false,
            verifyCodeButtonDisabled: true,
            phoneNumberInputReadOnly: true,
            sendCodeButtonVisible: false,
            unlinkPhoneButtonVisible: true,
            successMessage: 'undefined',
            errorMessage: 'errorMessage',
            showSpinner: false,
          }),
        },
      },
    },
  },
});