<template>
  <div class="app-container">
    <el-card shadow="never">
      <!-- 总开关：是否使用默认配置 -->
      <el-form :model="defaultSettingData" label-width="150px" style="max-width: 600px; margin-bottom: 20px">
        <el-form-item label="是否使用默认配置">
          <el-switch v-model="defaultSettingData.useDefault" @change="handleDefaultChange" />
        </el-form-item>
      </el-form>

      <!-- 翻译配置选项卡（仅在不使用默认配置时显示） -->
      <div v-show="!defaultSettingData.useDefault">
        <el-tabs v-model="activeTab" type="border-card">
          <el-tab-pane label="百度翻译" name="baidu" lazy>
            <el-form ref="baiduFormRef" :model="baiduSettingData" :rules="baiduRules" label-width="120px" style="max-width: 600px; margin-top: 20px">
              <el-form-item label="APP ID" prop="appId">
                <el-input v-model="baiduSettingData.appId" placeholder="请输入APP ID"></el-input>
              </el-form-item>
              <el-form-item label="密钥" prop="secretKey">
                <el-input v-model="baiduSettingData.secretKey" :rows="4" placeholder="请输入密钥"></el-input>
              </el-form-item>
              <el-form-item>
                <div style="margin-left: 130px; margin-top: 20px">
                  <el-button type="primary" @click="submitBaiduForm">保存配置</el-button>
                </div>
                <!-- <el-button @click="resetBaiduForm">重置</el-button> -->
              </el-form-item>
            </el-form>
          </el-tab-pane>

          <el-tab-pane label="有道翻译" name="youdao" lazy>
            <el-form
              ref="youdaoFormRef"
              :model="youdaoSettingData"
              :rules="youdaoRules"
              label-width="120px"
              style="max-width: 600px; margin-top: 20px"
            >
              <el-form-item label="App Key" prop="appKey">
                <el-input v-model="youdaoSettingData.appKey" placeholder="请输入App Key"></el-input>
              </el-form-item>
              <el-form-item label="密钥" prop="appSecret">
                <el-input v-model="youdaoSettingData.appSecret" :rows="4" placeholder="请输入密钥"></el-input>
              </el-form-item>
              <el-form-item>
                <div style="margin-left: 130px; margin-top: 20px">
                  <el-button type="primary" @click="submitYoudaoForm">保存配置</el-button>
                  <!-- <el-button @click="resetYoudaoForm">重置</el-button> -->
                </div>
              </el-form-item>
            </el-form>
          </el-tab-pane>

          <el-tab-pane label="谷歌翻译" name="google" lazy>
            <el-form
              ref="googleFormRef"
              :model="googleSettingData"
              :rules="googleRules"
              label-width="120px"
              style="max-width: 600px; margin-top: 20px"
            >
              <el-form-item label="API Key" prop="googleApiKey">
                <el-input v-model="googleSettingData.googleApiKey" placeholder="请输入谷歌API Key"></el-input>
              </el-form-item>
              <el-form-item>
                <div style="margin-left: 130px; margin-top: 20px">
                  <el-button type="primary" @click="submitGoogleForm">保存配置</el-button>
                </div>
              </el-form-item>
            </el-form>
          </el-tab-pane>
        </el-tabs>
      </div>
    </el-card>
  </div>
</template>

<script setup name="Setting" lang="ts">
import { listSetting, updateSetting } from '@/api/im/setting';
import { getCurrentInstance, ref, onMounted, ComponentInternalInstance, computed } from 'vue';
import { ElMessage, ElMessageBox } from 'element-plus';

const { proxy } = getCurrentInstance() as ComponentInternalInstance;

const buttonLoading = ref(false);
const loading = ref(true);
const activeTab = ref('baidu'); // 默认显示百度翻译

// 默认配置数据
const defaultSettingData = ref({
  useDefault: false
});

// 存储初始获取的数据
const initialBaiduData = ref({});
const initialYoudaoData = ref({});
const initialGoogleData = ref({}); // 添加谷歌初始数据存储

const baiduSettingData = ref({
  appId: '',
  secretKey: ''
});

const youdaoSettingData = ref({
  appKey: '',
  appSecret: ''
});

const googleSettingData = ref({
  googleApiKey: ''
});

// 百度翻译配置验证规则
const baiduRules = {
  appId: [
    { required: true, message: '请输入APP ID', trigger: 'blur' },
    { min: 1, max: 100, message: '长度在 1 到 100 个字符', trigger: 'blur' }
  ],
  secretKey: [
    { required: true, message: '请输入密钥', trigger: 'blur' },
    { min: 1, max: 200, message: '长度在 1 到 200 个字符', trigger: 'blur' }
  ]
};

// 有道翻译配置验证规则
const youdaoRules = {
  appKey: [
    { required: true, message: '请输入App Key', trigger: 'blur' },
    { min: 1, max: 100, message: '长度在 1 到 100 个字符', trigger: 'blur' }
  ],
  appSecret: [
    { required: true, message: '请输入密钥', trigger: 'blur' },
    { min: 1, max: 200, message: '长度在 1 到 200 个', trigger: 'blur' }
  ]
};

// 谷歌翻译配置验证规则
const googleRules = {
  googleApiKey: [
    { required: true, message: '请输入谷歌API Key', trigger: 'blur' },
    { min: 1, max: 200, message: '长度在 1 到 200 个字符', trigger: 'blur' }
  ]
};

/** 查询配置列表 */
const getList = async () => {
  loading.value = true;
  try {
    const res = await listSetting();
    //转为json对象
    // 更新翻译配置数据
    if (res.TRANSLATION_SETTING) {
      const parsedData = JSON.parse(res.TRANSLATION_SETTING);

      // 不管type是多少，都要保存现有数据到初始值变量
      if (parsedData.appId) {
        // 更新百度配置数据
        Object.assign(baiduSettingData.value, {
          appId: parsedData.appId,
          secretKey: parsedData.secretKey
        });
        // 保存到初始数据
        Object.assign(initialBaiduData.value, {
          appId: parsedData.appId,
          secretKey: parsedData.secretKey
        });
      }

      if (parsedData.appKey) {
        // 更新有道配置数据
        Object.assign(youdaoSettingData.value, {
          appKey: parsedData.appKey,
          appSecret: parsedData.appSecret
        });
        // 保存到初始数据
        Object.assign(initialYoudaoData.value, {
          appKey: parsedData.appKey,
          appSecret: parsedData.appSecret
        });
      }

      // 添加谷歌翻译数据初始化
      if (parsedData.googleApiKey) {
        Object.assign(googleSettingData.value, {
          googleApiKey: parsedData.googleApiKey
        });
        Object.assign(initialGoogleData.value, {
          googleApiKey: parsedData.googleApiKey
        });
      }

      // 根据type判断是否使用默认配置
      if (parsedData.type === '0') {
        defaultSettingData.value.useDefault = true;
      } else {
        defaultSettingData.value.useDefault = false;

        // 初始化百度和有道的数据并保存初始值
        if (parsedData.type === '1') {
          Object.assign(baiduSettingData.value, parsedData);
          Object.assign(initialBaiduData.value, parsedData); // 保存初始数据
          activeTab.value = 'baidu';
        } else if (parsedData.type === '2') {
          Object.assign(youdaoSettingData.value, parsedData);
          Object.assign(initialYoudaoData.value, parsedData); // 保存初始数据
          activeTab.value = 'youdao';
        } else if (parsedData.type === '3') {
          // 添加谷歌翻译类型
          Object.assign(googleSettingData.value, parsedData);
          Object.assign(initialGoogleData.value, parsedData); // 保存初始数据
          activeTab.value = 'google';
        }
      }
    }
    console.log('成功:', baiduSettingData.value, youdaoSettingData.value, googleSettingData.value);
  } catch (error) {
    ElMessage.error('获取配置失败');
  } finally {
    loading.value = false;
  }
};

/** 处理默认配置开关变化 */
const handleDefaultChange = (value: boolean) => {
  if (value) {
    // 如果切换到默认配置，发送type为0的请求
    updateTranslationSetting({ type: '0' });
  } else {
    // 如果从默认配置切换到自定义配置，需要显示提示或让用户选择一种自定义配置
    ElMessage.info('请选择并提交保存翻译配置');
  }
};

/** 更新翻译设置 */
const updateTranslationSetting = async (params: any) => {
  try {
    buttonLoading.value = true;
    params.settingName = 'TRANSLATION_SETTING';

    await updateSetting(params);
    ElMessage.success('启用默认配置');

    // 如果设置了默认配置，则更新状态
    if (params.type === '0') {
      defaultSettingData.value.useDefault = true;
    } else {
      defaultSettingData.value.useDefault = false;
    }
  } catch (error) {
    console.error('更新翻译配置失败:', error);
    ElMessage.error('更新翻译配置失败');
  } finally {
    buttonLoading.value = false;
  }
};

/** 提交百度翻译配置表单 */
const submitBaiduForm = async () => {
  const formRef = proxy.$refs.baiduFormRef as (typeof import('element-plus'))['ElForm'];
  const isValid = await formRef.validate().catch(() => false);

  if (!isValid) return;

  try {
    buttonLoading.value = true;
    const params = {
      settingName: 'TRANSLATION_SETTING',
      type: '1', // 百度翻译
      appId: baiduSettingData.value.appId,
      secretKey: baiduSettingData.value.secretKey,
      appKey: '', // 有道翻译相关的字段清空
      appSecret: '',
      googleApiKey: '' // 谷歌翻译相关字段清空
    };
    await updateSetting(params);
    ElMessage.success('启用百度翻译');

    // 更新初始数据
    Object.assign(initialBaiduData.value, {
      appId: baiduSettingData.value.appId,
      secretKey: baiduSettingData.value.secretKey
    });
  } catch (error) {
    console.error('更新百度翻译配置失败:', error);
    ElMessage.error('更新百度翻译配置失败');
  } finally {
    buttonLoading.value = false;
  }
};

/** 提交有道翻译配置表单 */
const submitYoudaoForm = async () => {
  const formRef = proxy.$refs.youdaoFormRef as (typeof import('element-plus'))['ElForm'];
  const isValid = await formRef.validate().catch(() => false);

  if (!isValid) return;

  try {
    buttonLoading.value = true;
    const params = {
      settingName: 'TRANSLATION_SETTING',
      type: '2', // 有道翻译
      appId: '', // 百度翻译相关的字段清空
      secretKey: '',
      appKey: youdaoSettingData.value.appKey,
      appSecret: youdaoSettingData.value.appSecret,
      googleApiKey: '' // 谷歌翻译相关字段清空
    };
    await updateSetting(params);
    ElMessage.success('启用有道翻译');

    // 更新初始数据
    Object.assign(initialYoudaoData.value, {
      appKey: youdaoSettingData.value.appKey,
      appSecret: youdaoSettingData.value.appSecret
    });
  } catch (error) {
    console.error('更新有道翻译配置失败:', error);
    ElMessage.error('更新有道翻译配置失败');
  } finally {
    buttonLoading.value = false;
  }
};

/** 提交谷歌翻译配置表单 */
const submitGoogleForm = async () => {
  const formRef = proxy.$refs.googleFormRef as (typeof import('element-plus'))['ElForm'];
  const isValid = await formRef.validate().catch(() => false);

  if (!isValid) return;

  try {
    buttonLoading.value = true;
    const params = {
      settingName: 'TRANSLATION_SETTING',
      type: '3', // 谷歌翻译
      appId: '', // 百度翻译相关的字段清空
      secretKey: '',
      appKey: '', // 有道翻译相关的字段清空
      appSecret: '',
      googleApiKey: googleSettingData.value.googleApiKey
    };
    await updateSetting(params);
    ElMessage.success('启用谷歌翻译');

    // 更新初始数据
    Object.assign(initialGoogleData.value, {
      googleApiKey: googleSettingData.value.googleApiKey
    });
  } catch (error) {
    console.error('更新谷歌翻译配置失败:', error);
    ElMessage.error('更新谷歌翻译配置失败');
  } finally {
    buttonLoading.value = false;
  }
};

/** 重置百度翻译配置表单 */
const resetBaiduForm = () => {
  const formRef = proxy.$refs.baiduFormRef as (typeof import('element-plus'))['ElForm'];

  // 重置为初始获取的数据
  if (initialBaiduData.value && Object.keys(initialBaiduData.value).length > 0) {
    Object.assign(baiduSettingData.value, {
      appId: initialBaiduData.value.appId || '',
      secretKey: initialBaiduData.value.secretKey || ''
    });
  } else {
    formRef.resetFields();
  }
};

/** 重置有道翻译配置表单 */
const resetYoudaoForm = () => {
  const formRef = proxy.$refs.youdaoFormRef as (typeof import('element-plus'))['ElForm'];

  // 重置为初始获取的数据
  if (initialYoudaoData.value && Object.keys(initialYoudaoData.value).length > 0) {
    Object.assign(youdaoSettingData.value, {
      appKey: initialYoudaoData.value.appKey || '',
      appSecret: initialYoudaoData.value.appSecret || ''
    });
  } else {
    formRef.resetFields();
  }
};

/** 重置谷歌翻译配置表单 */
const resetGoogleForm = () => {
  const formRef = proxy.$refs.googleFormRef as (typeof import('element-plus'))['ElForm'];

  // 重置为初始获取的数据
  if (initialGoogleData.value && Object.keys(initialGoogleData.value).length > 0) {
    Object.assign(googleSettingData.value, {
      googleApiKey: initialGoogleData.value.googleApiKey || ''
    });
  } else {
    formRef.resetFields();
  }
};

onMounted(() => {
  getList();
});
</script>
