package com.eitc.patient.service.impl;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.eitc.common.core.domain.AjaxResult;
import com.eitc.common.utils.StringUtils;
import com.eitc.common.utils.bean.BeanUtils;
import com.eitc.patient.domain.ClinicInfo;
import com.eitc.patient.mapper.ClinicInfoMapper;
import com.eitc.patient.service.IClinicInfoService;
import com.eitc.patient.vo.ClinicInfoVO;
import com.eitc.system.service.ISysDeptService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * ClinicInfoServiceImpl
 *
 * @author mtx
 * @date: 2024/05/17 15:39
 */
@Service
public class ClinicInfoServiceImpl extends ServiceImpl<ClinicInfoMapper, ClinicInfo> implements IClinicInfoService {

    @Resource
    private ISysDeptService sysDeptService;

    /**
     * 获取诊所信息的视图对象
     *
     * @return ClinicInfoVO 诊所信息视图对象，如果不存在则返回null
     */
    @Override
    public ClinicInfoVO findClinicInfo() {
        // 查询诊所信息列表
        List<ClinicInfo> list = this.list();
        // 创建诊所信息视图对象
        ClinicInfoVO vo = new ClinicInfoVO();

        // 检查查询结果是否为空
        if (CollectionUtils.isEmpty(list)) {
            return vo;
        }

        // 将查询到的诊所信息的第一个元素的属性复制到视图对象
        BeanUtils.copyProperties(list.get(0), vo);

        // 如果诊所工作日信息不为空，则将其转换为列表形式
        if (StringUtils.isNotEmpty(vo.getClinicWorkingDays())) {
            vo.setClinicWorkingDaysList(Arrays.asList(vo.getClinicWorkingDays().split(",")));
        }

        // 处理横幅图片信息，将其拆分并分别赋值给不同的属性
        String bannerPic = vo.getBannerPic();
        if(StringUtils.isNotEmpty(bannerPic)){
            String[] split = bannerPic.split(",");
            // 根据横幅图片数量，设置不同的属性
            if (split.length == 3) {
                vo.setBannerPic1(split[0]);
                vo.setBannerPic2(split[1]);
                vo.setBannerPic3(split[2]);
            }
            if (split.length == 2) {
                vo.setBannerPic1(split[0]);
                vo.setBannerPic2(split[1]);
            }
            if (split.length == 1) {
                vo.setBannerPic1(split[0]);
            }
        }

        return vo;
    }


    /**
     * 添加或修改诊所信息。
     *
     * @param clinicInfo 诊所信息对象，包含待添加或修改的诊所详情。
     * @return 如果操作成功，返回一个表示成功的AjaxResult；如果失败，返回一个表示失败的AjaxResult。
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult addOrUpdate(ClinicInfoVO clinicInfo) {
        // 查询当前诊所信息，如果存在，则使用现有ID更新传入的诊所信息对象
        ClinicInfoVO info = findClinicInfo();
        if (Objects.nonNull(info)) {
            clinicInfo.setId(info.getId());
        }

        // 将工作日列表转换为字符串，以逗号分隔，用于存储
        if (CollectionUtils.isNotEmpty(clinicInfo.getClinicWorkingDaysList())) {
            clinicInfo.setClinicWorkingDays(String.join(",", clinicInfo.getClinicWorkingDaysList()));
        }

        // 组合宣传图片链接，以逗号分隔，用于存储
        String str = "";
        if (StringUtils.isNotEmpty(clinicInfo.getBannerPic1())) {
            str = clinicInfo.getBannerPic1();
        }
        if (StringUtils.isNotEmpty(clinicInfo.getBannerPic2())) {
            if (StringUtils.isNotEmpty(str)) {
                str = str + "," + clinicInfo.getBannerPic2();
            } else {
                str = clinicInfo.getBannerPic2();
            }
        }
        if (StringUtils.isNotEmpty(clinicInfo.getBannerPic3())) {
            if (StringUtils.isNotEmpty(str)) {
                str = str + "," + clinicInfo.getBannerPic3();
            } else {
                str = clinicInfo.getBannerPic3();
            }
        }
        clinicInfo.setBannerPic(str);

        // 更新部门服务中的诊所名称，确保部门名称与诊所信息一致
        sysDeptService.setClinicName(clinicInfo.getClinicName());

        // 保存或更新诊所信息，并根据操作结果返回相应的AjaxResult
        return this.saveOrUpdate(clinicInfo) ? AjaxResult.success() : AjaxResult.error();
    }

}
