<template>
    <div class="app-container">
        <el-drawer v-model="shelvesDrawer" size="100%" :before-close="handleCancel">
            <el-card class="box-card">
                <h3>商品介绍</h3>
                <el-form ref="goodsRef" :rules="rules" :model="goods" label-width="150px">
                    <el-form-item label="商品编号" prop="goodsSn">
                        <el-input v-model="goods.goodsSn" />
                    </el-form-item>
                    <el-form-item label="商品名称" prop="name">
                        <el-input v-model="goods.name" />
                    </el-form-item>
                    <!-- <el-form-item label="市场售价" prop="counterPrice">
                        <el-input v-model="goods.counterPrice" placeholder="0.00">
                            <template slot="append">元</template>
                        </el-input>
                    </el-form-item> -->
                    <el-form-item label="是否新品">
                        <el-radio-group v-model="goods.isNew">
                            <el-radio :label="true">新品</el-radio>
                            <el-radio :label="false">非新品</el-radio>
                        </el-radio-group>
                    </el-form-item>
                    <el-form-item label="是否热卖">
                        <el-radio-group v-model="goods.isHot">
                            <el-radio :label="false">普通</el-radio>
                            <el-radio :label="true">热卖</el-radio>
                        </el-radio-group>
                    </el-form-item>
                    <el-form-item label="是否在售">
                        <el-radio-group v-model="goods.isOnSale">
                            <el-radio :label="true">在售</el-radio>
                            <el-radio :label="false">未售</el-radio>
                        </el-radio-group>
                    </el-form-item>

                    <el-form-item label="商品图片" prop="picUrl">
                        <el-upload :action="uploadPath" :limit="1" :show-file-list="false" :headers="headers"
                            :on-success="uploadPicUrl" list-type="picture" class="avatar-uploader"
                            accept=".jpg,.jpeg,.png,.gif">
                            <img v-if="goods.picUrl" :src="goods.picUrl" class="avatar" />
                            <el-icon v-else class="avatar-uploader-icon">
                                <Plus />
                            </el-icon>
                        </el-upload>
                    </el-form-item>

                    <el-form-item label="设计图片" prop="designUrl">
                        <el-upload :action="uploadPath" :limit="1" :show-file-list="false" :headers="headers"
                            :on-success="uploadCdUrl" list-type="picture" class="avatar-uploader"
                            accept=".jpg,.jpeg,.png,.gif">
                            <img v-if="goods.designUrl" :src="goods.designUrl" class="avatar" />
                            <el-icon v-else class="avatar-uploader-icon">
                                <Plus />
                            </el-icon>
                        </el-upload>
                    </el-form-item>

                    <el-form-item label="宣传画廊">
                        <el-upload ref="uploadRef" :action="uploadPath" :limit="5" :headers="headers"
                            :on-exceed="uploadOverrun" :on-success="handleGalleryUrl" :on-remove="handleRemove" multiple
                            accept=".jpg,.jpeg,.png,.gif" list-type="picture-card">
                            <el-icon class="avatar-uploader-icon">
                                <Plus />
                            </el-icon>
                        </el-upload>
                    </el-form-item>

                    <el-form-item label="商品单位">
                        <el-input v-model="goods.unit" placeholder="件 / 个 / 盒" />
                    </el-form-item>

                    <el-form-item label="关键字">
                        <el-tag v-for="tag in keywords" :key="tag" closable type="primary" @close="handleClose(tag)">
                            {{ tag }}
                        </el-tag>
                        <el-input v-if="newKeywordVisible" ref="newKeywordInput" v-model="newKeyword"
                            class="input-new-keyword" @keyup.enter.native="handleInputConfirm"
                            @blur="handleInputConfirm" />
                        <el-button v-else class="button-new-keyword" type="primary" @click="showInput">+ 增加</el-button>
                    </el-form-item>

                    <el-form-item label="商品配件">
                        <el-select v-model="goodsParts" multiple collapse-tags collapse-tags-tooltip
                            style="width: 240px" @change="partsChange">
                            <el-option v-for="item in partsList" :key="item.id" :label="item.name" :value="item.id" />
                        </el-select>
                    </el-form-item>

                    <el-form-item label="所属分类">
                        <el-select v-model="goods.categoryId" placeholder="请选择" @change="handleCategoryChange">
                            <el-option v-for="item in categoryList" :key="item.value" :label="item.label"
                                :value="item.value" />
                        </el-select>
                    </el-form-item>

                    <el-form-item label="所属品牌商">
                        <el-select v-model="goods.brandId" clearable>
                            <el-option v-for="item in brandList" :key="item.value" :label="item.label"
                                :value="item.value" />
                        </el-select>
                    </el-form-item>

                    <el-form-item label="商品简介">
                        <el-input v-model="goods.brief" />
                    </el-form-item>

                    <el-form-item label="商品详细介绍">
                        <richTextEditor :valueHtml='goods?.detail' @htmlChange="htmlChange" />
                    </el-form-item>
                </el-form>
            </el-card>

            <el-card class="box-card">
                <h3>商品规格</h3>
                <el-row :gutter="20" type="flex" align="middle" style="padding: 20px 0">
                    <el-col :span="10">
                        <el-button type="primary" @click="handleSpecificationShow">添加</el-button>
                    </el-col>
                </el-row>

                <el-table :data="specifications">
                    <el-table-column prop="specification" label="规格名" align="left" />
                    <el-table-column prop="value" label="规格值" align="center">
                        <template #default="scope">
                            <el-tag type="primary">
                                {{ scope.row.value }}
                            </el-tag>
                        </template>
                    </el-table-column>
                    <el-table-column prop="customSpec" label="自定义规格" align="center">
                        <template #default="scope">
                            <el-tag v-if="scope.row.customSpec" type="primary">
                                {{ scope.row.customSpec }}
                            </el-tag>
                            <el-tag v-else type="info">
                                {{ scope.row.customSpec }}
                            </el-tag>
                        </template>
                    </el-table-column>
                    <el-table-column align="center" label="操作" width="250" class-name="small-padding fixed-width">
                        <template #default="scope">
                            <el-button type="primary" size="small"
                                @click="handleSpecificationEdit(scope.row, scope.$index)">
                                编辑
                            </el-button>
                            <el-button type="danger" size="small" @click="handleSpecificationDelete(scope.row)">删除
                            </el-button>
                        </template>
                    </el-table-column>
                </el-table>

                <el-dialog v-model="specVisiable" :title="titleSpec" :before-close="handleSpecificationClose">
                    <el-form ref="specRef" :rules="rules" :model="specForm" status-icon label-position="left"
                        label-width="100px" style="width: 400px; margin-left: 50px">
                        <el-form-item label="规格名" prop="specification">
                            <el-select v-model="specForm.specification" class="m-2" placeholder="请选择规格名"
                                :disabled="disabledSpec" @change="dictChange">
                                <el-option v-for="item in dictList" :key="item.id" :label="item.dictName"
                                    :value="item.id" />
                            </el-select>
                        </el-form-item>
                        <el-form-item label="规格值" prop="value">
                            <el-select v-model="specForm.value" multiple collapse-tags collapse-tags-tooltip
                                placeholder="请选择规格值" :disabled="disabledSpec" style="width: 240px"
                                @change="dictItemChange">
                                <el-option v-for="item in dictItemList" :key="item.id" :label="item.itemText"
                                    :value="item.itemText" />
                            </el-select>
                        </el-form-item>
                        <el-form-item label="自定义规格">
                            <el-switch v-model="specForm.customSpec" @change="dictSwitchChange" />
                        </el-form-item>
                    </el-form>
                    <template #footer class="dialog-footer">
                        <el-button @click="handleSpecificationClose">取消</el-button>
                        <el-button type="primary" @click="handleSpecificationAdd">确定</el-button>
                    </template>
                </el-dialog>
            </el-card>

            <select-spec :specData="specifications" @productsData="productsData" />

            <template #footer>
                <el-button @click="handleCancel">取消</el-button>
                <el-button type="primary" @click="handlePublish">上架</el-button>
            </template>
        </el-drawer>
    </div>
</template>

<script setup lang="ts">
import { ref } from "vue";
import { publishGoods, listCatAndBrand } from "@/services/api/commodityManage/list";
import { uploadPath } from "@/services/api/storage";
import { ElMessage } from "element-plus";
import { listGoods } from "@/services/api/commodityManage/list";
import { getDictList, getDictItemList } from '@/services/api/market/auxiliary'
import selectSpec from './components/selectSpec.vue'
import richTextEditor from '@/components/richTextEditor.vue'

let shelvesDrawer = ref(false)
let newKeywordVisible = ref(false);
let newKeyword = ref("");
let uploadRef = ref();
let keywords = ref([] as any);
let categoryList = ref([] as any);
let brandList = ref([] as any);
let goods = ref({
    goodsSn: "",
    name: "",
    counterPrice: 0,
    gallery: [] as any,
    isHot: false,
    isNew: true,
    isOnSale: true,
    picUrl: "",
    designUrl: '',
    unit: "",
    brandId: "",
    brief: "",
    detail: '',
    categoryId: undefined,
    keywords: undefined,
});
let goodsParts = ref()
let specVisiable = ref(false);
let specForm = ref({ specification: "", value: "", picUrl: "", customSpec: false }); // customSpec 是否自定义规格
let titleSpec = ref('添加规格')
let disabledSpec = ref(false)
let specifications = ref([] as any);
let headers = ref({ 'Authorization': sessionStorage.getItem("token") })

let products = ref([]);
let goodsRef = ref()
let rules = ref({
    goodsSn: [{ required: true, message: "商品编号不能为空", trigger: "blur" }],
    name: [{ required: true, message: "商品名称不能为空", trigger: "blur" }],
    picUrl: [{ required: true, message: "商品图片不能为空", trigger: ["blur", 'change'] }],
    designUrl: [{ required: true, message: "设计图片不能为空", trigger: ["blur", 'change'] }],
});

let emits = defineEmits(['initShelves'])

let init = () => {
    listCatAndBrand().then((res: any) => {
        categoryList.value = res.data.categoryList;
        brandList.value = res.data.brandList;
    });
}
init()

let partsList = ref()
let initList = () => {
    listGoods({
        page: 1,
        limit: 10,
        sort: "add_time",
        order: "desc",
    }).then((res: any) => {
        if (res.code === 200) {
            partsList.value = res.data.list;
        }
    })
}
initList()

let htmlChange = (value: any) => goods.value.detail = value

let handleCategoryChange = (value: any) => {
    // console.log(goods.value.categoryId);
    // goods.value.categoryId = value[value.length - 1];
}
let handleCancel = () => {
    goods.value = {
        goodsSn: "",
        name: "",
        counterPrice: 0,
        gallery: [] as any,
        isHot: false,
        isNew: true,
        isOnSale: true,
        picUrl: "",
        designUrl: "",
        unit: "",
        brandId: "",
        brief: "",
        detail: '<p></p>',
        categoryId: undefined,
        keywords: undefined,
    }
    uploadRef.value.clearFiles()
    specifications.value = []
    products.value = []
    goodsParts.value = []
    keywords.value = []
    shelvesDrawer.value = false
}

let productsData = (data: any) => {
    products.value = data
}
let handlePublish = () => {
    goodsRef.value?.validate((valid: boolean) => {
        if (valid) {
            const finalGoods = {
                goods: goods.value,
                specifications: specifications.value,
                products: products.value,
                parts: partsData.value
            };
            publishGoods(finalGoods)
                .then((res: any) => {
                    if (res.code === 200) {
                        ElMessage({
                            type: 'success',
                            message: "创建成功",
                        });
                        emits('initShelves')
                        handleCancel()
                    }
                })
                .catch((res) => {
                    console.log(res, '上架错误');

                });
        } else return false
    })
}

let partsData = ref([] as any)
// 商品配件修改的值
let partsChange = (value: any) => {
    partsData.value = []
    partsList.value.map((item: any) => {
        value.map((res: any) => {
            if (res === item.id) {
                partsData.value.push({
                    partGoodsId: item.id,
                    partGoodsName: item.name
                })
            }
        })
    })
}

let handleClose = (tag: any) => {
    keywords.value.splice(keywords.value.indexOf(tag), 1);
    goods.value.keywords = keywords.value.toString();
}

let showInput = () => {
    newKeywordVisible.value = true;
}

let handleInputConfirm = () => {
    const newKeywords: string = newKeyword.value;
    if (newKeywords) {
        keywords.value.push(newKeywords);
        goods.value.keywords = keywords.value.toString();
    }
    newKeywordVisible.value = false;
    newKeyword.value = "";
}

let uploadPicUrl = (res: any) => {
    goods.value.picUrl = res.data.url;
}

let uploadCdUrl = (res: any) => {
    goods.value.designUrl = res.data.url;
}
let uploadOverrun = () => {
    ElMessage({
        type: "error",
        message: "上传文件个数超出限制!最多上传5张图片!",
    });
}
let handleGalleryUrl = (res: any, file: any, fileList: any) => {
    if (res.code === 200) {
        goods.value.gallery.push(res.data.url);
    }
}
let handleRemove = (file: any, fileList: any) => {
    for (let i = 0; i < goods.value.gallery.length; i++) {
        // 这里存在两种情况
        // 1. 如果所删除图片是刚刚上传的图片，那么图片地址是file.res.data.url
        //    此时的file.url虽然存在，但是是本机地址，而不是远程地址。
        // 2. 如果所删除图片是后台返回的已有图片，那么图片地址是file.url
        let url;
        if (file.res === undefined) {
            url = file.url;
        } else {
            url = file.res.data.url;
        }

        if (goods.value.gallery[i] === url) {
            goods.value.gallery.splice(i, 1);
        }
    }
}

let uploadSpecPicUrl = (res: any) => {
    console.log('上传成功');
    // specForm.value.picUrl = res.data.url;
}
let dictList = ref()
let handleSpecificationShow = () => {
    let dictQuery = {
        column: 'createTime',
        order: 'desc',
        pageNo: 1,
        pageSize: 999
    } // 字典查询参数
    getDictList(dictQuery).then((res: any) => {
        if (res.code === 200) {
            dictList.value = res.data.records
            specForm.value = { specification: "", value: "", picUrl: "", customSpec: false };
            disabledSpec.value = false
            titleSpec.value = '添加规格'
            specVisiable.value = true;
        }
    })
}

let handleSpecificationAdd = () => {
    if (titleSpec.value === '添加规格') {
        if (!dictName.value) return ElMessage({
            type: 'warning',
            message: '请选择规格名'
        })
        if (dictValue.value) {
            for (let s of dictValue.value) {
                for (let i of specifications.value) {
                    if (s == i.value) {
                        return ElMessage({
                            type: 'warning',
                            message: '已存在 ' + s + ' 规格值'
                        })
                    }
                }
                specifications.value.push({
                    specification: dictName.value,
                    value: s,
                    customSpec: dictSwitch.value
                })
            }
            dictValue.value = null
            dictName.value = null
            specForm.value = { specification: "", value: "", picUrl: "", customSpec: false }
            specVisiable.value = false;
            dictSwitch.value = false
        } else {
            ElMessage({
                type: 'warning',
                message: '请选择规格值'
            })
        }
    } else { // 编辑
        specForm.value.value = specForm.value.value[0]
        specifications.value[dictTableIndex.value] = specForm.value
        specifications.value?.forEach((item: any) => {
            if (specifications.value[dictTableIndex.value].specification === item.specification) {
                item.customSpec = specifications.value[dictTableIndex.value].customSpec
            }
        })
        specVisiable.value = false;
    }

}

// 取消添加商品规格
let handleSpecificationClose = () => {
    specForm.value.value = specForm.value.value[0]
    specForm.value.customSpec = dictTableIndexSwitch.value
    specifications.value[dictTableIndex.value] = specForm.value
    dictValue.value = null
    dictName.value = null
    specVisiable.value = false;
}

// 删除商品规格
let handleSpecificationDelete = (row: any) => {
    const index = specifications.value.indexOf(row);
    specifications.value.splice(index, 1);
}

// 编辑商品规格
let handleSpecificationEdit = (row: any, index: number) => {
    titleSpec.value = '设置规格'
    specVisiable.value = true
    disabledSpec.value = true
    let str = row.value
    dictTableIndexSwitch.value = row.customSpec
    row.value = []
    row.value.push(str)
    specForm.value = row
    dictTableIndex.value = index
}

let dictItemList = ref()
let dictName = ref()
let dictValue = ref()
let dictSwitch = ref(false) // table swith
let dictTableIndex = ref() // 点击编辑table index
let dictTableIndexSwitch = ref(false) // 点击编辑table swith值

let dictChange = (id: any) => {
    specForm.value.value = ''
    getDictItemList({ dictId: id, pageNo: 1, pageSize: 999 }).then((res: any) => {
        if (res.code === 200) {
            dictItemList.value = res.data.records
            for (let s of dictList.value) {
                if (s.id === id) dictName.value = s.dictName
            }
        }
    })
}
let dictItemChange = (val: []) => {
    dictValue.value = val
}
let dictSwitchChange = (val: boolean) => {
    dictSwitch.value = val
}

defineExpose({
    shelvesDrawer
})
</script>

<style>
.el-card {
    margin-bottom: 10px;
}

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

.input-new-keyword {
    width: 90px;
    margin-left: 10px;
    vertical-align: bottom;
}

.avatar-uploader .el-upload {
    width: 145px;
    height: 145px;
    border: 1px dashed #d9d9d9;
    border-radius: 6px;
    cursor: pointer;
    position: relative;
    overflow: hidden;
}

.avatar-uploader .el-upload:hover {
    border-color: #20a0ff;
}

.avatar-uploader-icon {
    font-size: 28px;
    color: #8c939d;
    width: 120px;
    height: 120px;
    line-height: 120px;
    text-align: center;
}

.avatar {
    width: 145px;
    height: 145px;
    display: block;
}

.op-container {
    display: flex;
    justify-content: center;
}
</style>