<template>
    <div class="iot-firmware">
        <el-card v-show="showSearch" style="margin-bottom: 15px; width: 100%">
            <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="78px" style="margin-bottom: -18px; padding: 3px 0 0 0">
                <el-form-item prop="firmwareName">
                    <el-input v-model="queryParams.firmwareName" :placeholder="$t('firmware.index.222541-1')" clearable @keyup.enter.native="handleQuery" />
                </el-form-item>
                <el-form-item>
                    <el-select v-model="queryParams.productId" :placeholder="$t('firmware.index.222541-2')" clearable @change="handleQuery" filterable>
                        <el-option v-for="product in productShortList" :key="product.id" :label="product.name" :value="product.id"></el-option>
                    </el-select>
                </el-form-item>
                <div style="float: right">
                    <el-button type="primary" icon="el-icon-search" @click="handleQuery">{{ $t('search') }}</el-button>
                    <el-button icon="el-icon-refresh" @click="resetQuery">{{ $t('reset') }}</el-button>
                </div>
            </el-form>
        </el-card>

        <el-card>
            <el-row :gutter="10" style="margin-bottom: 15px">
                <el-col :span="1.5">
                    <el-button type="primary" plain icon="el-icon-plus" size="small" @click="handleAdd" v-hasPermi="['iot:firmware:add']">{{ $t('add') }}</el-button>
                </el-col>
                <el-col :span="1.5">
                    <el-button plain icon="el-icon-delete" size="small" :disabled="multiple" @click="handleDelete" v-hasPermi="['iot:firmware:remove']">{{ $t('del') }}</el-button>
                </el-col>
                <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
            </el-row>

            <el-table v-loading="loading" :data="firmwareList" :border="false" @selection-change="handleSelectionChange">
                <el-table-column type="selection" align="center" width="55" />
                <el-table-column :label="$t('firmware.index.222541-0')" align="left" prop="firmwareName" min-width="210" />
                <el-table-column :label="$t('firmware.index.222541-48')" align="center" prop="firmwareType" width="120">
                    <template slot-scope="scope">
                        <span v-if="scope.row.firmwareType == 1">{{ $t('firmware.index.222541-49') }}</span>
                        <span v-else-if="scope.row.firmwareType == 2">HTTP</span>
                        <span v-else>-</span>
                    </template>
                </el-table-column>
                <el-table-column :label="$t('firmware.index.222541-4')" align="center" prop="version" width="120">
                    <template slot-scope="scope">
                        <span>Version</span>
                        {{ scope.row.version }}
                    </template>
                </el-table-column>
                <el-table-column :label="$t('firmware.index.222541-5')" align="left" prop="productName" min-width="210">
                    <template slot-scope="scope">
                        <el-link :underline="false" type="primary" @click="handleViewProduct(scope.row.productId)">
                            {{ scope.row.productName }}
                        </el-link>
                    </template>
                </el-table-column>
                <el-table-column :label="$t('firmware.index.222541-6')" align="left" prop="filePath" min-width="250">
                    <template slot-scope="scope">
                        <el-link :href="getDownloadUrl(scope.row.filePath)" :underline="false" type="primary">
                            {{ getDownloadUrl(scope.row.filePath) }}
                        </el-link>
                    </template>
                </el-table-column>
                <el-table-column :label="$t('firmware.index.222541-7')" align="center" prop="isLatest" width="80">
                    <template slot-scope="scope">
                        <el-tag type="primary" v-if="scope.row.isLatest == 1">{{ $t('firmware.index.222541-8') }}</el-tag>
                        <el-tag type="info" v-else>{{ $t('firmware.index.222541-9') }}</el-tag>
                    </template>
                </el-table-column>
                <el-table-column :label="$t('firmware.index.222541-10')" align="center" prop="createTime" width="185"></el-table-column>
                <el-table-column :label="$t('firmware.index.222541-11')" align="left" prop="remark" min-width="190" />
                <el-table-column fixed="right" :label="$t('opation')" align="center" class-name="small-padding fixed-width" width="185">
                    <template slot-scope="scope">
                        <el-button size="small" type="text" icon="el-icon-edit" @click="handleEdit(scope.row)" v-hasPermi="['iot:firmware:edit']">{{ $t('update') }}</el-button>
                        <el-button size="small" type="text" icon="el-icon-document" @click="handleInfo(scope.row)" v-hasPermi="['iot:firmware:query']">{{ $t('detail') }}</el-button>
                        <el-button size="small" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['iot:firmware:remove']">{{ $t('del') }}</el-button>
                    </template>
                </el-table-column>
            </el-table>

            <pagination style="margin-bottom: 20px" v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
        </el-card>

        <!-- 添加或修改产品固件对话框 -->
        <el-dialog :title="title" :visible.sync="open" width="620px" append-to-body>
            <el-form ref="form" :model="form" :rules="rules" label-width="120px">
                <el-form-item :label="$t('firmware.index.222541-0')" prop="firmwareName">
                    <el-input v-model="form.firmwareName" :placeholder="$t('firmware.index.222541-1')" style="width: 400px; display: block" />
                    <span style="font-size: 10px; display: block; color: rgb(245, 108, 108)">{{ $t('firmware.index.222541-13') }}</span>
                </el-form-item>
                <!-- 选择产品 -->
                <el-form-item label="" prop="productName">
                    <template slot="label">
                        {{ $t('device.device-edit.148398-4') }}
                    </template>
                    <el-input readonly v-model="form.productName" :placeholder="$t('device.device-edit.148398-5')" style="width: 400px">
                        <el-button slot="append" @click="selectProduct()">{{ $t('device.device-edit.148398-6') }}</el-button>
                    </el-input>
                </el-form-item>
                <el-form-item :label="$t('firmware.index.222541-50')" prop="firmwareType">
                    <el-select v-model="form.firmwareType" :placeholder="$t('firmware.index.222541-51')" style="width: 400px" disabled>
                        <el-option v-for="dict in dict.type.iot_firmware_type" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item :label="$t('firmware.index.222541-15')" prop="version">
                    <el-input v-model="form.version" :placeholder="$t('firmware.index.222541-16')" style="width: 400px" @input="validateVersion" />
                </el-form-item>
                <el-form-item :label="$t('firmware.index.222541-17')" prop="isLatest">
                    <el-switch v-model="form.isLatest" active-text="" inactive-text="" :active-value="1" :inactive-value="0"></el-switch>
                    <el-link type="info" :underline="false" style="font-size: 12px; margin-left: 15px">{{ $t('firmware.index.222541-18') }}</el-link>
                </el-form-item>
                <el-form-item :label="$t('firmware.index.222541-19')" prop="filePath">
                    <fileUpload ref="file-upload" :value="form.filePath" :limit="1" :fileSize="10" :fileType="['bin', 'zip', 'pdf']" @input="getFilePath($event)" style="width: 400px"></fileUpload>
                </el-form-item>
                <el-form-item :label="$t('firmware.index.222541-11')" prop="remark">
                    <el-input v-model="form.remark" type="textarea" :placeholder="$t('firmware.index.222541-21')" :autosize="{ minRows: 3, maxRows: 5 }" style="width: 400px" />
                </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
                <el-button type="primary" @click="submitForm">{{ $t('save') }}</el-button>
                <el-button @click="cancel">{{ $t('cancel') }}</el-button>
            </div>
        </el-dialog>
        <!-- 分组设备列表 -->
        <deviceList ref="deviceList" :upGrade="formUpGrade"></deviceList>
        <product-list ref="productList" :productId="form.productId" :showSenior="false" @productEvent="getProductData($event)" />
    </div>
</template>

<script>
import fileUpload from '../../../components/FileUpload/index';
import deviceList from './device-list';
import { listFirmware, upGradeVersionList, getFirmware, delFirmware, addFirmware, updateFirmware } from '@/api/iot/firmware';
import { addTask } from '@/api/iot/firmwareTask';
import { listDeviceByGroup } from '@/api/iot/device';
import { getToken } from '@/utils/auth';
import productList from '../device/product-list';
import { listShortProduct } from '@/api/iot/product';

export default {
    name: 'Firmware',
    dicts: ['iot_yes_no', 'oat_update_limit', 'iot_firmware_type'],
    components: {
        fileUpload,
        deviceList,
        productList,
    },
    data() {
        return {
            // 遮罩层
            loading: true,
            // 选中数组
            ids: [],
            // 非单个禁用
            single: true,
            // 非多个禁用
            multiple: true,
            // 显示搜索条件
            showSearch: true,
            // 总条数
            total: 0,
            // 产品固件表格数据
            firmwareList: [],
            // 产品简短列表
            productShortList: [],
            // 待升级固件(小于当前版本的产品固件)
            upGradeVersionList: [],
            // 设备分组
            group: {},
            // 弹出层标题
            title: '',
            // 是否显示弹出层
            open: false,
            //
            openUpGrade: false,
            queryUpGradeVersion: {
                productId: null,
                version: 0,
            },
            queryDeviceByVersion: {
                productId: null,
                firmwareVersion: 0,
            },
            // 查询参数
            queryParams: {
                pageNum: 1,
                pageSize: 10,
                firmwareName: null,
                productId: null,
                tenantName: null,
                isSys: null,
            },
            // 表单参数
            form: {
                version: 1.0,
            },
            // 表单校验
            rules: {
                firmwareName: [
                    {
                        required: true,
                        message: this.$t('firmware.index.222541-36'),
                        trigger: 'blur',
                    },
                ],
                firmwareType: [
                    {
                        required: true,
                        message: this.$t('firmware.index.222541-51'),
                        trigger: 'blur',
                    },
                ],
                productId: [
                    {
                        required: true,
                        message: this.$t('firmware.index.222541-37'),
                        trigger: 'blur',
                    },
                ],
                productName: [
                    {
                        required: true,
                        message: this.$t('firmware.index.222541-38'),
                        trigger: 'blur',
                    },
                ],
                version: [
                    {
                        required: true,
                        message: this.$t('firmware.index.222541-39'),
                        trigger: 'blur',
                    },
                ],
                filePath: [
                    {
                        required: true,
                        message: this.$t('firmware.index.222541-40'),
                        trigger: 'blur',
                    },
                ],
            },
            formUpGrade: {
                taskName: null,
                firmwareId: 0,
                deviceAmount: 0,
                bookTime: null,
                upgradeType: null,
                upType: null,
                deviceList: [],
                version: null,
                flag: false,
            },
            rulesUpGrade: {
                taskName: [
                    {
                        required: true,
                        message: this.$t('firmware.index.222541-41'),
                        trigger: 'blur',
                    },
                ],
                // bookTime: [{
                //   required: true,
                //   message: "请设置预定时间",
                //   trigger: "blur"
                // }]
            },
            // 上传参数
            upload: {
                // 是否禁用上传
                isUploading: false,
                // 设置上传的请求头部
                headers: {
                    Authorization: 'Bearer ' + getToken(),
                },
                // 上传的地址
                url: process.env.VUE_APP_BASE_API + '/iot/tool/upload',
                // 上传的文件列表
                fileList: [],
            },
        };
    },
    created() {
        this.getList();
        this.getProductShortList();
    },
    methods: {
        /** 查看产品按钮操作 */
        handleViewProduct(productId) {
            this.$router.push({
                path: '/iot/product-edit',
                query: {
                    t: Date.now(),
                    productId: productId,
                },
            });
        },
        /** 查询产品简短列表 */
        getProductShortList() {
            listShortProduct().then((response) => {
                this.productShortList = response.data;
            });
        },
        /**获取选中的产品 */
        getProductData(product) {
            this.form.productId = product.productId;
            this.form.productName = product.productName;
            this.$set(this.form, 'firmwareType', product.firmwareType);
        },
        // 获取下载路径前缀
        getDownloadUrl(path) {
            return window.location.origin + process.env.VUE_APP_BASE_API + path;
        },
        /** 查询产品固件列表 */
        getList() {
            this.loading = true;
            listFirmware(this.queryParams).then((response) => {
                this.firmwareList = response.rows;
                this.total = response.total;
                this.loading = false;
            });
        },
        //校验版本号，可以为整数或小数
        validateVersion() {
            const filteredValue = this.form.version.replace(/[^0-9.]/g, '');
            this.form.version = filteredValue;
            const dotCount = (this.form.version.match(/\./g) || []).length;
            // 如果小数点超过两个，移除最后输入的字符
            if (dotCount > 2) {
                this.form.version = this.form.version.slice(0, -1);
            }
        },

        // 取消按钮
        cancel() {
            this.open = false;
            this.reset();
        },
        // 表单重置
        reset() {
            this.form = {
                firmwareId: null,
                firmwareName: null,
                productId: null,
                productName: null,
                tenantId: null,
                tenantName: null,
                isLatest: 0,
                isSys: null,
                version: 1.0,
                filePath: null,
                delFlag: null,
                createBy: null,
                createTime: null,
                updateBy: null,
                updateTime: null,
                remark: null,
            };
            // 固件升级表单
            this.formUpGrade = {
                taskName: null,
                firmwareId: 0,
                deviceAmount: 0,
                bookTime: null,
                upgradeType: null,
                deviceList: [],
                version: null,
                flag: false,
            };
            this.resetForm('form');
            this.resetForm('formUpGrade');
        },
        /** 搜索按钮操作 */
        handleQuery() {
            this.queryParams.pageNum = 1;
            this.getList();
        },
        /** 重置按钮操作 */
        resetQuery() {
            this.queryParams.productId = null;
            this.resetForm('queryForm');
            this.handleQuery();
        },
        /**选择产品 */
        selectProduct() {
            this.$refs.productList.open = true;
            this.$refs.productList.getList();
        },
        // 多选框选中数据
        handleSelectionChange(selection) {
            this.ids = selection.map((item) => item.firmwareId);
            this.single = selection.length !== 1;
            this.multiple = !selection.length;
        },
        /** 新增按钮操作 */
        handleAdd() {
            this.reset();
            this.open = true;
            this.title = this.$t('firmware.index.222541-42');
            this.upload.fileList = [];
        },
        /** 修改按钮操作 */
        handleEdit(row) {
            this.reset();
            const firmwareId = row.firmwareId || this.ids;
            getFirmware(firmwareId).then((response) => {
                this.form = response.data;
                this.open = true;
                this.title = this.$t('firmware.index.222541-43');
                this.upload.fileList = [
                    {
                        name: this.form.firmwareName,
                        url: this.form.filePath,
                    },
                ];
            });
        },
        // 详情按钮
        handleInfo(row) {
            if (row) {
                sessionStorage.setItem('firmwareTaskInfo', JSON.stringify(row));
                this.$router.push({
                    name: 'FirmwareTask',
                });
            }
        },
        /** 提交按钮 */
        submitForm() {
            this.$refs['form'].validate((valid) => {
                if (valid) {
                    if (this.form.firmwareId != null) {
                        updateFirmware(this.form).then((response) => {
                            this.$modal.msgSuccess(this.$t('updateSuccess'));
                            this.open = false;
                            this.getList();
                        });
                    } else {
                        addFirmware(this.form).then((response) => {
                            this.$modal.msgSuccess(this.$t('addSuccess'));
                            this.open = false;
                            this.getList();
                        });
                    }
                }
            });
        },
        /** 删除按钮操作 */
        handleDelete(row) {
            const firmwareIds = row.firmwareId || this.ids;
            this.$modal
                .confirm(this.$t('firmware.index.222541-44', [firmwareIds]))
                .then(function () {
                    return delFirmware(firmwareIds);
                })
                .then(() => {
                    this.getList();
                    this.$modal.msgSuccess(this.$t('delSuccess'));
                })
                .catch(() => {});
        },
        /** 导出按钮操作 */
        handleExport() {
            this.download(
                'iot/firmware/export',
                {
                    ...this.queryParams,
                },
                `firmware_${new Date().getTime()}.xlsx`
            );
        },
        // /** 选择产品 */
        // selectProduct(val) {
        //   for (var i = 0; i < this.productShortList.length; i++) {
        //     if (this.productShortList[i].id == val) {
        //       this.form.productName = this.productShortList[i].name;
        //       return;
        //     }
        //   }
        // },
        /** 切换升级类型*/
        changeUpgradeType(val) {
            this.resetDeviceList();
            if (val == 2) {
                this.formUpGrade.version = null;
            }
        },
        /** 升级范围 */
        changeUpType(val) {
            this.resetDeviceList();
            if (val == '1') {
                this.queryDeviceByVersion.productId = this.formUpGrade.productId;
                this.queryDeviceByVersion.firmwareVersion = this.formUpGrade.version;
                listDeviceByGroup(this.queryDeviceByVersion).then((response) => {
                    response.rows.forEach((row) => {
                        this.formUpGrade.deviceList.push(row.serialNumber);
                    });
                    this.formUpGrade.deviceAmount = response.total;
                });
            }
        },
        /** 选择待升级固件版本 */
        selectUpGradeVersion(val) {
            this.resetDeviceList();
            for (var i = 0; i < this.upGradeVersionList.length; i++) {
                if (this.upGradeVersionList[i].firmwareId == val) {
                    this.formUpGrade.version = this.upGradeVersionList[i].version;
                    return;
                }
            }
        },
        resetDeviceList() {
            this.formUpGrade.upgradeType = this.formUpGrade.upgradeType;
            this.formUpGrade.deviceList = [];
            this.formUpGrade.deviceAmount = 0;
        },
        /*选择设备*/
        selectDeviceList() {
            // 刷新子组件
            this.formUpGrade.flag = true;
            this.$refs.deviceList.openDeviceList = true;
        },
        // 移除选中设备
        handleClose(tag) {
            this.formUpGrade.deviceList.splice(this.formUpGrade.deviceList.indexOf(tag), 1);
            this.formUpGrade.deviceAmount = this.formUpGrade.deviceList.length;
        },
        // 获取文件路径
        getFilePath(data) {
            this.form.filePath = data;
        },
        // 文件提交处理
        submitUpload() {
            this.$refs.upload.submit();
        },
        // 文件上传中处理
        handleFileUploadProgress(event, file, fileList) {
            this.upload.isUploading = true;
        },
        // 文件上传成功处理
        handleFileSuccess(response, file, fileList) {
            this.upload.isUploading = false;
            this.form.filePath = response.url;
            this.$modal.msgSuccess(response.msg);
        },
        // 文件下载处理
        handleDownload(row) {
            window.open(process.env.VUE_APP_BASE_API + row.filePath);
        },
        submitFormUpGrade() {
            this.$refs['formUpGrade'].validate((valid) => {
                if (valid) {
                    if (this.formUpGrade.deviceAmount > 0) {
                        addTask(this.formUpGrade).then((response) => {
                            if (response.code == 200) {
                                this.$modal.msgSuccess(this.$t('updateSuccess'));
                                this.openUpGrade = false;
                                this.reset();
                            } else {
                                this.$modal.msgError(res.data.message);
                            }
                        });
                    } else {
                        this.$modal.msgError(this.$t('firmware.index.222541-47'));
                    }
                }
            });
        },
        canceUpGrade() {
            this.openUpGrade = false;
            this.reset();
        },
        /** 查询待升级固件版本简短列表 */
        getUpGradeVersionList() {
            this.queryUpGradeVersion.productId = this.form.productId;
            this.queryUpGradeVersion.version = this.form.version;
            upGradeVersionList(this.queryUpGradeVersion).then((response) => {
                this.upGradeVersionList = response.data;
            });
        },
    },
};
</script>
<style lang="scss" scoped>
.iot-firmware {
    padding: 20px;
}

.el-tag + .el-tag {
    margin-left: 10px;
}

.item {
    margin-right: 10px;
}

.upload-file-list .el-upload-list__item {
    border: unset;
}
</style>
