<template>
    <a-modal :mask-closable="false" :esc-to-close="false" :visible="userData.show" :title="userData.title"
        :modal-style="{ width: '550px' }" @cancel="close">
        <template #footer>
            <div class="flex-between">
                <div class="flex-row">
                    <div class="label-color mr" v-if="status !== hostStatusEnum.unTest">{{
                        $t('detail.index.5q09asiwjvg0')
                    }}
                    </div>
                    <a-tag v-if="status === hostStatusEnum.success" color="green">{{
                        $t('transcribe.create.addHost.5mphy3snvg80')
                    }}</a-tag>
                    <a-tag v-if="status === hostStatusEnum.fail" color="red">{{
                        $t('transcribe.create.addHost.5mphy3snwq40')
                    }}</a-tag>
                </div>
                <div>
                    <a-button @click="close" class="mr">{{ $t('transcribe.create.addHost.5mphy3snwxs0') }}</a-button>
                    <a-button :loading="testLoading" class="mr" @click="handleTestHost">{{
                        $t('transcribe.create.addHost.5mphy3snx3o0')
                    }}</a-button>
                    <a-button @click="handleBeforeOk" :loading="submitLoading" type="primary">{{
                        $t('transcribe.create.addHost.5mphy3snx7c0') }}</a-button>
                </div>
            </div>
        </template>
        <a-form :model="userData.formData" ref="formRef" :label-col="{ style: { width: '90px' } }" auto-label-width>
            <a-form-item :label="$t('transcribe.create.addHost.host')">
                {{ userData.formData.privateIp }}({{ userData.formData.publicIp }})
            </a-form-item>
            <a-form-item field="username" :label="$t('transcribe.create.addHost.username')" validate-trigger="blur"
                :rules="[{ required: true, message: t('transcribe.create.addHost.usernamePlaceholder') }]">
                <a-input v-model="userData.formData.username"
                    :placeholder="$t('transcribe.create.addHost.usernamePlaceholder')"></a-input>
            </a-form-item>
            <a-form-item field="password" :label="$t('transcribe.create.addHost.5mphy3sny4w0')" validate-trigger="blur"
                :rules="[{ required: true, message: t('transcribe.create.addHost.5mphy3snyao0') }]">
                <a-input-password v-model="userData.formData.password"
                    :placeholder="$t('transcribe.create.addHost.5mphy3snyao0')" allow-clear />
            </a-form-item>
        </a-form>
    </a-modal>
    <a-modal width="auto" v-model:visible="userData.confirmVisible" @ok="handleConfirm" @cancel="handleCancel">
        <template #title>
            {{ $t('transcribe.create.addHost.confirm') }}
        </template>
        <div>{{ $t('transcribe.create.addHost.pwdsavmsg') }}</div>
    </a-modal>
</template>
<script setup>
import { reactive, ref } from 'vue'
import { addHostUser, editHostUser, hostPing } from '@/api/playback'
import { Message } from '@arco-design/web-vue'
import { useI18n } from 'vue-i18n'
import { encryptPassword } from '@/utils/jsencrypt'
const { t } = useI18n()

const hostStatusEnum  = {
    unTest: -1,
    success: 1,
    fail: 0
}

const userData = reactive({
    show: false,
    title: t('transcribe.create.adduser'),
    isNeedPwd: true,
    formData: {
        id: '',
        hostId: '',
        privateIp: '',
        publicIp: '',
        port: '',
        username: '',
        password: ''
    },
    confirmVisible: false
})

const emits = defineEmits([`finish`])

const status = ref(hostStatusEnum.unTest)
const testLoading = ref(false)
const handleTestHost = () => {
    formRef.value?.validate().then(async result => {
        if (!result) {
            testLoading.value = true
            const { password, publicIp, privateIp, port, username } = userData.formData
            const encryptPwd = await encryptPassword(password)
            const param = {
                privateIp,
                publicIp,
                port,
                password: encryptPwd,
                username
            }
            hostPing(param).then((res) => {
                if (Number(res.code) === 200) {
                    status.value = hostStatusEnum.success
                } else {
                    status.value = hostStatusEnum.fail
                }
            }).catch(() => {
                status.value = hostStatusEnum.fail
            }).finally(() => {
                testLoading.value = false
            })
        }
    })
}

const submitLoading = ref(false)
const formRef = ref(null)
const handleBeforeOk = () => {
    formRef.value?.validate().then(async result => {
        if (!result) {
            userData.confirmVisible = true
        }
    })
}

const close = () => {
    userData.show = false
    userData.confirmVisible = false
}

const userBelongingIp = ref('')
const handleConfirm = async () => {
    submitLoading.value = true
    const userPwd = await encryptPassword(userData.formData.password)
    const param = Object.assign({}, userData.formData)
    param.password = userPwd
    if (userData.formData.id) {
        // edit
        editHostUser(userData.formData.id, param).then(() => {
            Message.success({ content: `Modified success` })
            emits(`finish`, userBelongingIp.value)
            close()
        }).finally(() => {
            submitLoading.value = false
        })
    } else {
        const param = {
            hostId: userData.formData.hostId,
            username: userData.formData.username,
            password: userPwd
        }
        addHostUser(param).then((res) => {
          if (Number(res.code) === 200) {
            Message.success({ content: `Create success` })
            emits(`finish`, userBelongingIp.value)
            close()
          }
        }).catch((error) => {
          Message.error({ content: `Create fail` + error })
          emits(`finish`, userBelongingIp.value)
          close()
        }).finally(() => {
            submitLoading.value = false
        })
    }
}

const handleCancel = () => {
    userData.confirmVisible = false
}

const open = (type, hostData) => {
  status.value = hostStatusEnum.unTest
  userBelongingIp.value = type
  userData.show = true
  userData.isNeedPwd = !hostData.isRemember
  const { hostId, privateIp, publicIp, port } = hostData
  userData.title = t('transcribe.create.adduser')
  Object.assign(userData.formData, {
    id: '',
    hostId,
    privateIp,
    publicIp,
    port,
    username: '',
    password: ''
  })
}

defineExpose({
    open
})

</script>

<style scoped></style>