import http from '@/support/http';
import { ref, unref, watch } from 'vue';
import { Code } from '@/enum/app';
import Message from '@/support/message';
import { FormInstance } from 'element-plus';
import { AxiosResponse } from 'axios';
import { isFunction } from '@/support/helper';

// get table list
export function useCreate(
  path: string,
  id: string | number | null = null,
  _formData: object = {},
  other = false,
  type = 'post'
) {
  const formData = ref<object>(_formData);

  const loading = ref<boolean>();
  const isClose = ref<boolean>(false);

  // 创建前 hook
  const beforeCreate = ref();
  // 更新前 hook
  const beforeUpdate = ref();

  const afterCreate = ref();
  const afterUpdate = ref();
  // store
  function store(path: string, id: string | number | null = null) {
    loading.value = true;
    let promise: Promise<AxiosResponse> | null = null;
    if (id) {
      if (isFunction(beforeUpdate.value)) {
        beforeUpdate.value();
      }

      promise = http.put(path + '/' + id, unref(formData));
    } else {
      if (isFunction(beforeCreate.value)) {
        beforeCreate.value();
      }

      promise = http.post(path, unref(formData));
    }

    promise
      .then(r => {
        if (r.data.code === Code.SUCCESS) {
          isClose.value = true;
          Message.success(r.data.message);
          // 创建后的操作
          if (!id && isFunction(afterCreate.value)) {
            afterCreate.value();
          }
          // 更新后的操作
          if (id && isFunction(afterUpdate.value)) {
            afterUpdate.value();
          }
        } else {
          Message.error(r.data.message);
        }
      })
      .finally(() => {
        loading.value = false;
      });
  }
  function storeOther(path: string, type: string) {
    loading.value = true;
    let promise: Promise<AxiosResponse> | null = null;

    if (isFunction(beforeCreate.value)) {
      beforeCreate.value();
    }

    if (type == 'get') {
      promise = http.get(path, unref(formData));
    } else if (type == 'put') {
      promise = http.put(path, unref(formData));
    } else {
      promise = http.post(path, unref(formData));
    }

    promise
      .then(r => {
        if (r.data.code === Code.SUCCESS) {
          isClose.value = true;
          Message.success(r.data.message);
          // 创建后的操作
          if (!id && isFunction(afterCreate.value)) {
            afterCreate.value();
          }
          // 更新后的操作
          if (id && isFunction(afterUpdate.value)) {
            afterUpdate.value();
          }
        } else {
          Message.error(r.data.message);
        }
      })
      .finally(() => {
        loading.value = false;
      });
  }

  const form = ref<FormInstance>();
  const submitForm = (formEl: FormInstance | undefined) => {
    if (!formEl) return;
    formEl
      .validate(valid => {
        if (valid) {
          if (other) {
            storeOther(path, type);
          } else {
            store(path, id);
          }
        } else {
          loading.value = false;
        }
      })
      .then(() => {});
  };

  const close = (func: Function) => {
    watch(isClose, function (value) {
      if (value && isFunction(func)) {
        func();
      }
    });
  };

  return {
    formData,
    loading,
    form,
    submitForm,
    close,
    beforeCreate,
    beforeUpdate,
    afterCreate,
    afterUpdate
  };
}
