<template>
  <div class="send-service">
    <div class="use-service">
      <div class="life-cycle-alert">
        如果接口存在跨域、鉴权等情况,则请手动将响应数据,粘贴至下方的“请求结果”编辑器中。*
        如果不存在上述情况,完善以上信息,点击此按钮,编辑器将请求该接口,响应的数据,将自动填充至下方的“请求结果”编辑器中。
      </div>
    </div>
  </div>
  <div>
    <remote-data-adapter-form
      v-model="state.shouldFetch"
      name="是否可以发起请求的计算函数(shouldFetch)"
    ></remote-data-adapter-form>
    <remote-data-adapter-form v-model="state.willFetch" name="请求参数处理函数(willFetch)"></remote-data-adapter-form>
    <remote-data-adapter-form v-model="state.dataHandler" name="请求完成回调函数(dataHandler)">
      <template #title>
        <tiny-popover placement="top" trigger="hover">
          <div>为了支持mock数据和表格快捷生成字段功能,数据源最终返回的格式建议是:</div>
          <div>对于对象数组:<code>{ code: string, msg: string, data: {items: any[], total: number} }</code></div>
          <div>对于树结构:<code>{ code: string, msg: string, data: any }</code></div>
          <template #reference>
            <div>
              <icon-help-circle class="help-icon"></icon-help-circle>
            </div>
          </template>
        </tiny-popover>
      </template>
    </remote-data-adapter-form>
    <remote-data-adapter-form
      v-model="state.errorHandler"
      name="请求失败后的回调函数(errorHandler)"
    ></remote-data-adapter-form>
  </div>
</template>

<script>
import { reactive, ref, watch } from 'vue'
import { Popover } from '@opentiny/vue'
import { iconHelpCircle } from '@opentiny/vue-icon'
import { constants } from '@opentiny/tiny-engine-utils'
import RemoteDataAdapterForm from './RemoteDataAdapterForm.vue'

const { DEFAULT_INTERCEPTOR } = constants

const dataHandler = ref(null)
const willFetch = ref(null)
const shouldFetch = ref(null)
const errorHandler = ref(null)

export default {
  components: {
    TinyPopover: Popover,
    IconHelpCircle: iconHelpCircle(),
    RemoteDataAdapterForm
  },
  props: {
    modelValue: {
      type: Object,
      default: () => ({})
    }
  },
  emits: ['sendRequst', 'update:modelValue'],
  setup(props, { emit }) {
    const state = reactive({
      dataHandler: props.modelValue.dataHandler || DEFAULT_INTERCEPTOR.dataHandler.value,
      willFetch: props.modelValue.willFetch || DEFAULT_INTERCEPTOR.willFetch.value,
      shouldFetch: props.modelValue.shouldFetch || DEFAULT_INTERCEPTOR.shouldFetch.value,
      errorHandler: props.modelValue.errorHandler || DEFAULT_INTERCEPTOR.errorHandler.value
    })

    const getEditorValue = () => ({
      dataHandler: { type: 'JSFunction', value: state.dataHandler },
      willFetch: { type: 'JSFunction', value: state.willFetch },
      shouldFetch: { type: 'JSFunction', value: state.shouldFetch },
      errorHandler: { type: 'JSFunction', value: state.errorHandler }
    })

    watch(
      () => [state.dataHandler, state.willFetch, state.shouldFetch, state.errorHandler],
      ([dataHandler, willFetch, shouldFetch, errorHandler]) => {
        emit('update:modelValue', { dataHandler, willFetch, shouldFetch, errorHandler })
      }
    )

    return {
      state,
      getEditorValue,
      dataHandler,
      willFetch,
      shouldFetch,
      errorHandler
    }
  }
}
</script>

<style lang="less" scoped>
.send-service {
  :deep(.tiny-alert) {
    .tiny-alert__content {
      .tiny-alert__description {
        font-size: 14px;
        margin-bottom: -5px;
      }
    }
  }
  .life-cycle-alert {
    font-size: 11px;
    color: var(--ti-lowcode-datasource-tip-color);
  }
}
</style>