<template>
	<view class="safe-page min-page">
		<up-sticky>
			<view class="bg-fff u-p-l-30 u-p-b-24">
				<view class="input-wrapper">
					<view class="input-main">
						<view class="u-flex u-p-r-30 u-font-28" @click="onCategoryShowChange(true)">
							<text class="u-m-r-10 u-line-1" style="max-width: 100rpx">{{ pageData.categoryName || '全部' }}</text>
							<up-icon name="arrow-down" size="16"></up-icon>
						</view>
						<uni-easyinput
							clearable
							class="jeepay-search"
							:inputBorder="false"
							:placeholder="pageData.search.placeholder"
							v-model="pageData.query.name"
							@clear="searchFunc"
							@confirm="searchFunc"
						>
							<template #prefixIcon>
								<image src="@/static/iconImg/icon-search.svg" class="input-icon" />
							</template>
						</uni-easyinput>
						<view class="u-m-l-4">
							<button type="text" @click="searchFunc"><text class="color-333">搜索</text></button>
						</view>
					</view>
				</view>
				<view class="u-flex states1 u-row-between u-font-28">
					<view
						class="u-flex-1 item u-flex u-row-center tranistion u-text-center color-333"
						:class="{ active: pageData.stateCurrent == index }"
						@tap="statesTableClick(index)"
						v-for="(item, index) in statesTabsList"
						:key="index"
					>
						<view class="text">{{ item }}</view>
					</view>
				</view>
			</view>
		</up-sticky>
		<template v-if="pageData.stateCurrent == 0">
			<view class="goods-list u-p-30">
				<template v-if="pageData.bindGoodsList.length">
					<view class="u-m-b-32" v-for="(item, index) in pageData.bindGoodsList" :key="index">
						<my-goods isBind :index="index" :data="item" @del="goodsDel" :showDetail="pageData.showGoodsDetail"></my-goods>
					</view>
				</template>
				<template v-if="pageData.hasAjax && !pageData.bindGoodsList.length">
					<my-img-empty :tips="isSearch ? '未搜索到相关绑定商品' : '暂无绑定商品'"></my-img-empty>
				</template>
				<view style="height: 100rpx"></view>
			</view>
		</template>
		<template v-else>
			<view class="goods-list u-p-30">
				<view class="bg-fff border-r-18 u-p-t-16 u-p-b-16 box-shadow">
					<template v-if="pageData.goodsList.length">
						<view class="" v-for="(item, index) in pageData.goodsList" :key="index">
							<my-goods @goodsClick="goodsClick" :index="index" :data="item" :showDetail="pageData.showGoodsDetail"></my-goods>
						</view>
					</template>
					<template v-if="pageData.hasAjax && !pageData.goodsList.length">
						<my-img-empty tips="未找到相关商品"></my-img-empty>
					</template>
				</view>
				<view class="fixed-b">
					<my-button shape="circle" @click="save">确定</my-button>
				</view>
				<view style="height: 100rpx"></view>
			</view>
		</template>

		<!-- 分类 -->
		<my-category v-model:isShow="pageData.categoryShow" @confirm="setCategory"></my-category>
	</view>
</template>

<script setup>
import { onLoad, onShow } from '@dcloudio/uni-app';
import { reactive, ref, watch } from 'vue';
import myGoods from './components/goods.vue';
import myCategory from './components/category.vue';
import { hasPermission } from '@/commons/utils/hasPermission.js';

import { categoryPage } from '@/http/api/cateGory.js';
import { getProductPage, getProdGroupDetail, updateProdGroup } from '@/http/api/product.js';

const pageData = reactive({
	stateCurrent: 0,
	search: {
		value: '',
		placeholder: '输入搜索的商品'
	},
	showGoodsDetail: false,
	bindGoodsList: [],
	goodsList: [],
	query: {
		page: 1,
		size: 999,
		categoryId: '',
		name: '',
		id: ''
	},
	// 原始已绑定的上商品列表
	bindOriginGoodsList: [],
	category: '',
	categoryList: [], //分类列表
	categoryShow: false,
	categoryName: '',
	hasAjax: false
});

let isSearch = ref(false);
const statesTabsList = ['已添加', '未添加'];
const control = ref(null);
const model = ref(null);
const option = reactive({});
//分类
const category = ref(null);
onLoad((opt) => {
	Object.assign(option, opt);
	init();
});
onShow(() => {});
watch(
	() => pageData.query.categoryId,
	(newval) => {
		if (pageData.stateCurrent == 1) {
			getGoodsList();
		} else {
			getGroupBindGoods();
		}
	}
);

watch(
	() => pageData.stateCurrent,
	(newval) => {
		if (newval == 1) {
			getGoodsList();
		} else {
			getGroupBindGoods();
		}
	}
);
async function init() {
	await getGroupBindGoods();
	getGoodsList();
}

/**
 * 搜索
 */
async function searchFunc() {
	isSearch.value = true;
	if (pageData.stateCurrent) {
		getGoodsList();
	} else {
		const res = await getProdGroupDetail(option.id);
		pageData.bindGoodsList = res.productList.filter((v) => {
			return v.name.includes(pageData.query.name) && (pageData.query.categoryId == '' ? true : v.categoryId == pageData.query.categoryId);
		});
	}
}

/**
 * 获取商品列表
 */
function getGoodsList() {
	getProductPage(pageData.query).then((res) => {
		pageData.hasAjax = true;
		let goodsList = res.records.map((v) => {
			return {
				...v,
				checked: false
			};
		});
		pageData.goodsList = goodsList.filter((v) => {
			return !pageData.bindOriginGoodsList.find((bindGoods) => bindGoods.id == v.id);
		});
	});
}

/**
 * 获取分组详情
 */
async function getGroupBindGoods() {
	let res = await getProdGroupDetail(option.id);
	pageData.bindOriginGoodsList = res.productList;
	pageData.bindGoodsList = res.productList.filter((v) => {
		return pageData.query.categoryId === '' ? true : v.categoryId == pageData.query.categoryId && v.name.includes(pageData.query.name);
	});
}

/**
 * 已添加/未添加切换
 * @param {Object} index
 */
function statesTableClick(index) {
	pageData.stateCurrent = index;
}

/**
 * 分类选择
 * @param {Object} show
 */
function onCategoryShowChange(show) {
	pageData.categoryShow = show;
}

/**
 * 分类选择确定
 * @param {Object} category
 */
function setCategory(category) {
	pageData.query.categoryId = category.id;
	pageData.categoryName = category.name;
}

/**
 * 绑定商品
 */
async function save() {
	const res = await hasPermission('允许修改分组');
	if (!res) {
		return;
	}
	await updateProdGroup({
		...option,
		productIds: [...pageData.bindOriginGoodsList.map((v) => v.id), ...pageData.goodsList.filter((v) => v.checked).map((v) => v.id)]
	});
	pageData.stateCurrent = 0;
}

/**
 * 删除商品
 * @param {Object} index
 */
async function goodsDel(index) {
	const res = await hasPermission('允许修改分组');
	if (!res) {
		return;
	}
	const goods = pageData.bindOriginGoodsList[index];
	uni.showModal({
		title: '提示',
		content: '是否确认将' + goods.name + '从该分组中移除',
		success: function (res) {
			if (res.confirm) {
				pageData.bindGoodsList.splice(index, 1);
				pageData.bindOriginGoodsList.splice(index, 1);
				updateProdGroup({
					...option,
					productIds: pageData.bindOriginGoodsList.map((v) => v.id)
				});
			} else if (res.cancel) {
			}
		}
	});
}

function goodsClick(e) {
	pageData.goodsList[e].checked = !pageData.goodsList[e].checked;
}
</script>
<style scoped>
page {
	background: #f9f9f9;
}
</style>
<style lang="scss" scoped>
.stock-btns {
	padding: 0 100rpx;
	display: flex;
	flex-direction: column;
	gap: 20rpx;
}

.safe-page {
	background: #f9f9f9;
}

.icon-guige {
	width: 42rpx;
	height: 42rpx;
}

.bg-fff {
	background-color: #fff;
}

.myTabs {
	margin: 0 auto;
	width: 434rpx;
	height: 64rpx;
}

.input-wrapper {
	display: flex;
	justify-content: space-between;
	align-items: center;
	padding-top: 26rpx;
	background-color: $J-bg-ff;

	.input-main {
		flex: 1;
		display: flex;
		align-items: center;
		height: 64rpx;

		image {
			padding: 22rpx;
			width: 26rpx;
			height: 26rpx;
		}

		input {
			flex: 1;
			font-size: 27rpx;
		}

		::v-deep uni-button {
			font-size: 28rpx;
			color: $my-main-color;
			background: rgba(255, 255, 255, 1);
		}

		::v-deep.uni-easyinput {
			.uni-easyinput__content {
				background-color: $J-bg-f5 !important;
				border-radius: $J-b-r12;

				.uni-easyinput__content-input {
					padding-left: 0 !important;

					.uni-input-input {
						border-radius: $J-b-r12 !important;
						overflow: hidden !important;
					}
				}

				.uni-input-placeholder {
					font-size: 27rpx;
				}

				.uni-icons {
					color: rgba(230, 230, 230, 1) !important;
				}
			}
		}
	}
}

.input-icon {
	position: relative;
	z-index: 10;
}

.search-button {
	position: absolute;
	right: 0;
	background-color: transparent !important;
	color: transparent !important;
}

.states1 {
	margin-top: 24rpx;

	.item {
		font-size: 28rpx;
		color: #666;

		.text {
			position: relative;
			padding-top: 14rpx;
			padding-bottom: 16rpx;

			&::after {
				content: '';
				display: block;
				position: absolute;
				transition: all 0.2s ease-in-out;
				left: 10rpx;
				right: 10rpx;
				bottom: 0;
				height: 4rpx;
				background: transparent;
				border-radius: 12rpx 12rpx 12rpx 12rpx;
			}
		}

		&.active {
			color: $my-main-color;
			border-radius: 8rpx 8rpx 8rpx 8rpx;

			.text {
				&::after {
					background-color: $my-main-color;
				}
			}
		}
	}
}

.fixed-b {
	position: fixed;
	bottom: calc(env(safe-area-inset-bottom) + 16rpx);
	/* #ifdef H5 */
	bottom: 50rpx;
	/* #endif */
	left: 110rpx;
	right: 110rpx;
}
</style>
