<script setup lang="ts">
import { onMounted, reactive, ref, watch } from "vue";
import { FormInstance, FormRules, UploadProps } from "element-plus";
import { getRoleManageList, getUserList } from "@/api/business";
import {
  getDeptManageList,
  saveUserInfo,
  updateUserInfo,
  downloadFile
} from "@/api/system";
import { message } from "@/utils/message";
import { Plus } from "@element-plus/icons-vue";
defineOptions({
  name: "CreateForm"
});

const props = defineProps({
  createFlag: {
    type: Boolean,
    default: false
  },
  updateFrom: {
    type: Object,
    default: () => {
      return {};
    }
  },
  accountFromType: {
    type: String,
    default: ""
  },
  closeDrawer: {
    type: Function
  }
});
const modalVisible = ref(false);
console.log(props.accountFromType);
// 监听 props.message 的变化,并更新 modalVisible
watch(
  () => props.createFlag,
  newValue => {
    modalVisible.value = newValue; // 更新 modalVisible
    if (newValue) {
      if (
        props.accountFromType === "edit" ||
        props.accountFromType === "view"
      ) {
        getFlowDetails(props.updateFrom);
      }
    }
  }
);
watch(
  () => props.accountFromType,
  newValue => {
    console.log(newValue, "newValue");
  }
);
const ruleAccountFormRef = ref<FormInstance>();
const accountForm = reactive({
  id: "",
  headPicId: "",
  account: "",
  username: "",
  deptId: "",
  roleIds: [],
  remark: ""
});
const deptList = ref([]);
const roleNameList = ref([]);
const userNameList = ref([]);
const rules = reactive<FormRules>({
  headPicId: [
    {
      required: true,
      message: "请选择",
      trigger: "change"
    }
  ],
  account: [{ required: true, message: "请输入", trigger: "blur" }],
  username: [{ required: true, message: "请输入", trigger: "blur" }],
  deptId: [
    {
      required: true,
      message: "请选择",
      trigger: "change"
    }
  ],
  roleIds: [
    {
      required: true,
      message: "请选择",
      trigger: "change"
    }
  ],
  remark: [{ required: true, message: "请输入", trigger: "blur" }]
});

const imageUrl = ref("");

const handleAvatarSuccess: UploadProps["onSuccess"] = (
  response,
  uploadFile
) => {
  console.log(response, "response");
  accountForm.headPicId = response.data;
  imageUrl.value = URL.createObjectURL(uploadFile.raw!);
};

const beforeAvatarUpload: UploadProps["beforeUpload"] = rawFile => {
  console.log(rawFile);
  // if (rawFile.type !== "image/jpeg") {
  //   // ElMessage.error("Avatar picture must be JPG format!");
  //   return false;
  // } else if (rawFile.size / 1024 / 1024 > 2) {
  //   // ElMessage.error("Avatar picture size can not exceed 2MB!");
  //   return false;
  // }
  return true;
};

const submitForm = async (formEl: FormInstance | undefined) => {
  if (!formEl) return;
  await formEl.validate((valid, fields) => {
    if (valid) {
      console.log(accountForm);
      // // console.log("submit!");
      // const createForm = {
      //   id: "",
      //   flowName: accountForm.flowName,
      //   remark: accountForm.remark,
      //   flowType: accountForm.flowType,
      //   roleIds: accountForm.roleIds,
      // };
      if (props.accountFromType === "edit") {
        updateUserInfo(accountForm).then(res => {
          if (res.code === 200) {
            message("修改成功", { type: "success" });
            props.closeDrawer();
          }
        });
      } else {
        saveUserInfo(accountForm).then(res => {
          if (res.code === 200) {
            message("新建成功", { type: "success" });
            props.closeDrawer();
          }
        });
      }
    } else {
      console.log("error submit!", fields);
    }
  });
};
const resetForm = (formEl: FormInstance | undefined) => {
  if (!formEl) return;
  // formEl.resetFields();
  accountForm.id = "";
  accountForm.headPicId = "";
  accountForm.account = "";
  accountForm.username = "";
  accountForm.deptId = "";
  accountForm.roleIds = [];
  accountForm.remark = "";
};
const handleDrawerClosed = () => {
  accountForm.id = "";
  accountForm.headPicId = "";
  accountForm.account = "";
  accountForm.username = "";
  accountForm.deptId = "";
  accountForm.roleIds = [];
  accountForm.remark = "";
  props.closeDrawer();
};

const getDeptManageLists = async () => {
  const res: any = await getDeptManageList({
    baseName: "",
    deptCode: "",
    pageNum: 1,
    pageSize: 20
  });
  console.log(res);
  if (res.code == 200) {
    deptList.value = res.data.records;
  }
};
const getRoleManageLists = async () => {
  const res: any = await getRoleManageList({
    roleName: "",
    pageNum: "1",
    pageSize: "10"
  });
  // console.log(res);
  if (res.code == 200) {
    roleNameList.value = res.data.records;
  }
};
const getUserLists = async () => {
  const res: any = await getUserList({
    userName: "",
    deptId: "",
    roleId: "",
    pageNum: "1",
    pageSize: "10"
  });
  // console.log(res);
  if (res.code == 200) {
    userNameList.value = res.data.records;
  }
};
const getFlowDetails = (value: any) => {
  accountForm.id = props.accountFromType === "edit" ? value.id : "";
  accountForm.headPicId = value.headPicId;
  accountForm.account = value.account;
  accountForm.username = value.username;
  accountForm.deptId = value.deptId;
  accountForm.roleIds = value.userRoleList?.map(item => {
    return item.roleId;
  });
  accountForm.remark = value.remark;
};
const drawerName = (type: any) => {
  if (type === "edit") {
    return "编辑账号";
  } else if (type === "view") {
    return "查看账号";
  } else {
    return "新建账号";
  }
};
onMounted(() => {
  getDeptManageLists();
  getRoleManageLists();
  getUserLists();
});
</script>

<template>
  <div>
    <el-drawer
      v-model="modalVisible"
      modal-class="drawer_content"
      :with-header="false"
      @closed="handleDrawerClosed"
    >
      <div class="drawer_header">
        <span>{{ drawerName(props.accountFromType) }}</span>
      </div>
      <div class="drawer_box">
        <el-form
          :model="accountForm"
          :rules="rules"
          ref="ruleAccountFormRef"
          label-width="auto"
        >
          <el-form-item label="头像" prop="headPicId">
            <el-upload
              class="avatar-uploader"
              action="/know-sub/file/upload"
              :show-file-list="false"
              :on-success="handleAvatarSuccess"
              :before-upload="beforeAvatarUpload"
            >
              <!-- <img
                v-if="accountForm.headPicId"
                :src="imageUrl"
                class="avatar"
              /> -->
              <img
                v-if="accountForm.headPicId"
                :src="
                  props.accountFromType === 'edit'
                    ? downloadFile(accountForm.headPicId)
                    : imageUrl
                "
                class="avatar"
              />
              <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
            </el-upload>
          </el-form-item>
          <el-form-item label="用户名" prop="account">
            <el-input
              v-model="accountForm.account"
              autocomplete="off"
              placeholder="请输入"
            />
          </el-form-item>
          <el-form-item label="姓名" prop="username">
            <el-input
              v-model="accountForm.username"
              autocomplete="off"
              placeholder="请输入"
            />
          </el-form-item>
          <el-form-item label="所属部门" prop="deptId">
            <el-select
              v-model="accountForm.deptId"
              clearable
              placeholder="请选择"
              class="w-full"
            >
              <el-option
                v-for="item in deptList"
                :key="item.id"
                :label="item.deptName"
                :value="item.id"
              />
            </el-select>
          </el-form-item>
          <el-form-item label="角色" prop="roleIds">
            <el-select
              v-model="accountForm.roleIds"
              multiple
              clearable
              collapse-tags
              placeholder="请选择"
              popper-class="custom-header"
              :max-collapse-tags="3"
              class="w-full"
            >
              <el-option
                v-for="item in roleNameList"
                :key="item.id"
                :label="item.roleName"
                :value="item.id"
              />
            </el-select>
          </el-form-item>
          <el-form-item label="备注" prop="remark">
            <el-input
              v-model="accountForm.remark"
              type="textarea"
              placeholder="请输入"
            />
          </el-form-item>
        </el-form>
        <div class="drawer_footer" v-if="props.accountFromType !== 'view'">
          <el-button plain @click="resetForm(ruleAccountFormRef)"
            >重置</el-button
          >
          <el-button type="primary" @click="submitForm(ruleAccountFormRef)"
            >确定</el-button
          >
        </div>
      </div>
    </el-drawer>
  </div>
</template>

<style lang="scss" scoped>
:deep(.el-drawer__body) {
  padding: 0 !important;
}

.drawer_content {
  .drawer_header {
    box-sizing: border-box;
    height: 96px;
    padding: 24px;
    line-height: 65px;
    border-bottom: 1px solid #e9e9e9;

    span {
      padding-left: 8px;
      font-size: 20px;
      border-left: 6px solid #0052d9;
    }
  }

  .drawer_box {
    box-sizing: border-box;
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    height: calc(100vh - 96px);
    padding: 24px;

    .drawer_footer {
      display: flex;
      justify-content: flex-end;
    }
  }

  .avatar-uploader {
    display: block;
    width: 100px;
    height: 100px;
    border: 1px solid #d9d9d9;
    border-radius: 6px;
  }

  .avatar-uploader .avatar {
    width: 100px;
    height: 100px;
    // display: block;
    // border: 1px solid #d9d9d9;
  }

  .avatar-uploader .el-upload {
    position: relative;
    overflow: hidden;
    cursor: pointer;
    border-radius: 6px;
    transition: var(--el-transition-duration-fast);
  }

  .avatar-uploader .el-upload:hover {
    border-color: var(--el-color-primary);
  }

  .el-icon.avatar-uploader-icon {
    width: 100px;
    height: 100px;
    font-size: 28px;
    color: #8c939d;
    text-align: center;
  }
}
</style>