/*
 *    Copyright (c) 2018-2025, hnqz All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * Neither the name of the pig4cloud.com developer nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 * Author: hnqz
 */
package com.qunzhixinxi.hnqz.admin.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qunzhixinxi.hnqz.admin.entity.ReAlbumDrug;
import com.qunzhixinxi.hnqz.admin.entity.ReDeptDrug;
import com.qunzhixinxi.hnqz.admin.entity.WmDaDrugEntDrugtable;
import com.qunzhixinxi.hnqz.admin.mapper.ReDeptDrugMapper;
import com.qunzhixinxi.hnqz.admin.mapper.WmDaDrugEntDrugtableMapper;
import com.qunzhixinxi.hnqz.admin.service.ReDeptDrugService;
import com.qunzhixinxi.hnqz.admin.service.WmDaDrugEntDrugtableService;
import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
import com.qunzhixinxi.hnqz.common.core.util.R;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 档案-药企药品
 *
 * @author gaoyanng
 * @date 2020-06-25 23:35:42
 */
@Service
@AllArgsConstructor
public class WmDaDrugEntDrugtableServiceImpl extends ServiceImpl<WmDaDrugEntDrugtableMapper, WmDaDrugEntDrugtable> implements WmDaDrugEntDrugtableService {

	private final ReDeptDrugService reDeptDrugService;

	@Override
	public R listReDept(WmDaDrugEntDrugtable wmDaDrugEntDrugtable) {

		List<ReDeptDrug> list = reDeptDrugService.list(Wrappers.<ReDeptDrug>lambdaQuery()
				.eq(ReDeptDrug::getDrugId, wmDaDrugEntDrugtable.getId()));

		List<String> reDeptList = list.stream().map(p -> p.getDeptId() + "").collect(Collectors.toList());
		return R.ok(reDeptList);
	}

	/**
	 * 获取药品
	 *
	 * @param page     分页信息
	 * @param deptId   部门id
	 * @param drugName 药品名称
	 * @return 药品列表
	 */
	@Override
	public IPage<WmDaDrugEntDrugtable> listDrugs(Page page, Integer deptId, String drugName) {
		LambdaQueryWrapper<WmDaDrugEntDrugtable> queryWrapper = Wrappers.lambdaQuery();
		if (StringUtils.isNotEmpty(drugName)) {
			queryWrapper.like(WmDaDrugEntDrugtable::getDrugname, drugName);
		}
		if (deptId != null) {
			final List<ReDeptDrug> reDeptDrugList = reDeptDrugService.list(Wrappers.<ReDeptDrug>lambdaQuery()
					.eq(ReDeptDrug::getDeptId, deptId));
			final List<Integer> drugIdList = reDeptDrugList.stream()
					.mapToInt(ReDeptDrug::getDrugId)
					.boxed()
					.collect(Collectors.toList());
			queryWrapper.in(WmDaDrugEntDrugtable::getId, drugIdList);
		}

		return page(page, queryWrapper);
	}

	/**
	 * 根据部门id获取关联药品生产生产企业名称
	 *
	 * @param deptId 部门id
	 * @return 生产企业列表
	 */
	@Override
	public Set<String> listDrugProducerByDeptId(Integer deptId) {
		Set<Integer> drugIds = reDeptDrugService.list(Wrappers.<ReDeptDrug>lambdaQuery()
				.eq(deptId != null, ReDeptDrug::getDeptId, deptId))
				.stream()/**/
				.mapToInt(ReDeptDrug::getDrugId)
				.boxed()
				.collect(Collectors.toSet());

		if (CollectionUtil.isEmpty(drugIds)){
			return new HashSet<>(0);
		}

		return list(Wrappers.<WmDaDrugEntDrugtable>lambdaQuery()
				.eq(WmDaDrugEntDrugtable::getDelFlag, CommonConstants.STATUS_NORMAL)
				.eq(WmDaDrugEntDrugtable::getEnableFlag, CommonConstants.STATUS_NORMAL)
				.in(WmDaDrugEntDrugtable::getId, drugIds))
				.stream()
				.map(WmDaDrugEntDrugtable::getDrugEntName)
				.collect(Collectors.toSet());
	}

	@Override
	public R distribute(WmDaDrugEntDrugtable wmDaDrugEntDrugtable) {
		int id = Integer.parseInt(wmDaDrugEntDrugtable.getId());
		List<String> deptList = wmDaDrugEntDrugtable.getReDeptList();

		List<ReDeptDrug> reDeptDrugs = new ArrayList<>();

		reDeptDrugService.remove(Wrappers.<ReDeptDrug>lambdaQuery().eq(ReDeptDrug::getDrugId, id));


		for (String str : deptList) {
			ReDeptDrug reDeptDrug = new ReDeptDrug();
			reDeptDrug.setDeptId(Integer.parseInt(str));
			reDeptDrug.setDrugId(id);
			reDeptDrugs.add(reDeptDrug);
		}
		reDeptDrugService.saveBatch(reDeptDrugs);

		WmDaDrugEntDrugtable updateEntity = new WmDaDrugEntDrugtable();

		updateEntity.setId(wmDaDrugEntDrugtable.getId());
		updateEntity.setDrugEntNum(deptList.size());
		this.baseMapper.updateById(updateEntity);


		return R.ok();
	}


}
