package com.yihu.wlyy.service.common.util;

import com.yihu.wlyy.entity.doctor.team.sign.DoctorPatientGroupInfo;
import com.yihu.wlyy.entity.doctor.team.sign.DoctorTeam;
import com.yihu.wlyy.entity.doctor.team.sign.DoctorTeamInfo;
import com.yihu.wlyy.entity.doctor.team.sign.DoctorTeamMember;
import com.yihu.wlyy.entity.education.HealthEduArticle;
import com.yihu.wlyy.entity.education.HealthEduArticlePatient;
import com.yihu.wlyy.entity.patient.SignFamily;
import com.yihu.wlyy.repository.doctor.DoctorPatientGroupInfoDao;
import com.yihu.wlyy.repository.doctor.DoctorTeamDao;
import com.yihu.wlyy.repository.doctor.DoctorTeamMemberDao;
import com.yihu.wlyy.repository.education.HealthEduArticleDao;
import com.yihu.wlyy.repository.education.HealthEduArticlePatientDao;
import com.yihu.wlyy.repository.patient.SignFamilyDao;
import com.yihu.wlyy.service.BaseService;
import com.yihu.wlyy.util.IdCardUtil;
import com.yihu.wlyy.util.SystemConf;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ExecutionException;

/**
 * Created by lyr-pc on 2016/10/11.
 */
@Service
public class ManageUtilService extends BaseService {

    @Autowired
    SignFamilyDao signFamilyDao;
    @Autowired
    DoctorPatientGroupInfoDao groupInfoDao;
    @Autowired
    DoctorTeamDao teamDao;
    @Autowired
    DoctorTeamMemberDao teamMemberDao;
    @Autowired
    JpaTransactionManager transactionManager;
    @Autowired
    HealthEduArticleDao healthEduArticleDao;
    @Autowired
    HealthEduArticlePatientDao healthEduArticlePatientDao;

    public static int page = 0;
    public static List<Integer> errorPages = new ArrayList<>();
    public static List<Long> errorSigns = new ArrayList<>();

    /**
     * 清洗头同步签约数据分组
     *
     * @return
     */
    public void signPatientSetGroup() {
        boolean flag = true;

        while (flag) {
            PageRequest pageRequest = new PageRequest(0, 1000);
            Page<SignFamily> signs = signFamilyDao.findByTypeAndSignSource(2, "1", pageRequest);

            if (signs != null && signs.getContent().size() < 1000) {
                flag = false;
            }

            System.out.println("sign-patient-group-team:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别，开启新事务
            TransactionStatus status = transactionManager.getTransaction(def); // 获得事务状态

            try {
                for (SignFamily sign : signs.getContent()) {
                    try {
                        if (StringUtils.isNotEmpty(sign.getTeamCode())) {
                            continue;
                        }

                        //建立团队
                        DoctorTeam doctorTeam = new DoctorTeam();
                        String doctorTeamCode = getCode();

                        doctorTeam.setCode(doctorTeamCode);
                        doctorTeam.setCzrq(new Date());
                        doctorTeam.setName("团队名称:" + sign.getName());
                        doctorTeam.setSignType("2");//家庭签约
                        doctorTeam.setDel("1");

                        teamDao.save(doctorTeam);

                        //添加团队成员
                        if (StringUtils.isNotEmpty(sign.getDoctor())) {
                            //添加全科
                            DoctorTeamMember wlyyDoctorTeamDoctor = new DoctorTeamMember();

                            wlyyDoctorTeamDoctor.setTeam(doctorTeamCode);
                            wlyyDoctorTeamDoctor.setMemberCode(sign.getDoctor());
                            wlyyDoctorTeamDoctor.setName(sign.getDoctorName());
                            wlyyDoctorTeamDoctor.setDel("1");
                            wlyyDoctorTeamDoctor.setType(2);
                            wlyyDoctorTeamDoctor.setSignType("2");//家庭签约
                            wlyyDoctorTeamDoctor.setCode(getCode());
                            wlyyDoctorTeamDoctor.setCzrq(new Date());

                            teamMemberDao.save(wlyyDoctorTeamDoctor);
                        }
                        if (StringUtils.isNotEmpty(sign.getDoctorHealth())) {
                            //添加健康管理师
                            DoctorTeamMember wlyyDoctorTeamDoctor = new DoctorTeamMember();

                            wlyyDoctorTeamDoctor.setTeam(doctorTeamCode);
                            wlyyDoctorTeamDoctor.setMemberCode(sign.getDoctorHealth());
                            wlyyDoctorTeamDoctor.setName(sign.getDoctorHealthName());
                            wlyyDoctorTeamDoctor.setDel("1");
                            wlyyDoctorTeamDoctor.setType(3);
                            wlyyDoctorTeamDoctor.setSignType("2");//家庭签约
                            wlyyDoctorTeamDoctor.setCode(getCode());
                            wlyyDoctorTeamDoctor.setCzrq(new Date());

                            teamMemberDao.save(wlyyDoctorTeamDoctor);
                        }

                        //添加患者和团队的关系
                        DoctorTeamMember wlyyDoctorTeamPatient = new DoctorTeamMember();

                        wlyyDoctorTeamPatient.setTeam(doctorTeamCode);
                        wlyyDoctorTeamPatient.setMemberCode(sign.getPatient());
                        wlyyDoctorTeamPatient.setName(sign.getName());
                        wlyyDoctorTeamPatient.setDel("1");
                        wlyyDoctorTeamPatient.setSignType("2");//家庭签约
                        wlyyDoctorTeamPatient.setType(5);
                        wlyyDoctorTeamPatient.setCode(getCode());
                        wlyyDoctorTeamPatient.setCzrq(new Date());

                        teamMemberDao.save(wlyyDoctorTeamPatient);

                        if (StringUtils.isEmpty(sign.getIdcard())) {
                            System.out.println("error:sign-family-set-group:no-idcard:" + sign.getId());
                            continue;
                        }

                        int age = IdCardUtil.getAgeForIdcard(sign.getIdcard());
                        String groupCode = "1";

                        if (age >= 65) {
                            groupCode = "3";
                        }

                        if (StringUtils.isNotEmpty(sign.getDoctorHealth())) {
                            //把病人添加到健康管理师的健康分组里
                            DoctorPatientGroupInfo doctorPatientGroupInfo = new DoctorPatientGroupInfo();

                            doctorPatientGroupInfo.setCzrq(new Date());
                            doctorPatientGroupInfo.setDoctor(sign.getDoctorHealth());
                            doctorPatientGroupInfo.setStatus(1);
                            doctorPatientGroupInfo.setPatient(sign.getPatient());
                            doctorPatientGroupInfo.setPname(sign.getName());
                            doctorPatientGroupInfo.setPartAmount(0);
                            doctorPatientGroupInfo.setGroup(groupCode);//默认健康分组
                            doctorPatientGroupInfo.setQyrq(sign.getApplyDate());
                            doctorPatientGroupInfo.setSignType("2");//家庭签约

                            groupInfoDao.save(doctorPatientGroupInfo);
                        }

                        if (StringUtils.isNotEmpty(sign.getDoctor())) {
                            //把病人添加到全科医生的健康分组里
                            DoctorPatientGroupInfo doctorPatientGroupInfo = new DoctorPatientGroupInfo();

                            doctorPatientGroupInfo.setCzrq(new Date());
                            doctorPatientGroupInfo.setDoctor(sign.getDoctor());
                            doctorPatientGroupInfo.setStatus(1);
                            doctorPatientGroupInfo.setPatient(sign.getPatient());
                            doctorPatientGroupInfo.setPname(sign.getName());
                            doctorPatientGroupInfo.setPartAmount(0);
                            doctorPatientGroupInfo.setGroup(groupCode);//默认健康分组
                            doctorPatientGroupInfo.setQyrq(sign.getApplyDate());
                            doctorPatientGroupInfo.setSignType("2");//家庭签约

                            groupInfoDao.save(doctorPatientGroupInfo);
                        }

                        List<DoctorPatientGroupInfo> groups = groupInfoDao.findPatientGroups(sign.getPatient());

                        if (groups != null && groups.size() > 0) {
                            for (DoctorPatientGroupInfo group : groups) {
                                if (StringUtils.isNotEmpty(group.getSignType()) && group.getSignType().equals("2")) {
                                    continue;
                                }

                                DoctorPatientGroupInfo patientGroup = new DoctorPatientGroupInfo();

                                patientGroup.setCzrq(new Date());
                                patientGroup.setDoctor(group.getDoctor());
                                patientGroup.setStatus(1);
                                patientGroup.setPatient(sign.getPatient());
                                patientGroup.setPname(sign.getName());
                                patientGroup.setPartAmount(0);
                                patientGroup.setGroup(group.getGroup());
                                patientGroup.setQyrq(sign.getApplyDate());
                                patientGroup.setSignType("2");//家庭签约

                                groupInfoDao.save(patientGroup);
                            }
                        }
                        sign.setTeamCode(doctorTeamCode);
                        signFamilyDao.save(sign);
                    } catch (Exception e) {
                        e.printStackTrace();
                        errorSigns.add(sign.getId());
                    }
                }
                //事物提交
                transactionManager.commit(status);
                System.out.println("sign-patient-group-team:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            } catch (Exception e) {
                transactionManager.rollback(status);
            }
        }
    }

    /**
     * 执行某一页
     *
     * @param page
     * @throws Exception
     */
    @Transactional
    public void setSignTeamAndGroupByPage(int page) throws Exception {
        PageRequest pageRequest = new PageRequest(page, 1000);
        Page<SignFamily> signs = signFamilyDao.findByTypeAndSignSource(2, "1", pageRequest);

        for (SignFamily sign : signs.getContent()) {
            if (StringUtils.isNotEmpty(sign.getTeamCode())) {
                continue;
            }

            //建立团队
            DoctorTeam doctorTeam = new DoctorTeam();
            String doctorTeamCode = getCode();

            doctorTeam.setCode(doctorTeamCode);
            doctorTeam.setCzrq(new Date());
            doctorTeam.setName("团队名称:" + sign.getName());
            doctorTeam.setSignType("2");//家庭签约
            doctorTeam.setDel("1");

            teamDao.save(doctorTeam);

            //添加团队成员
            if (StringUtils.isNotEmpty(sign.getDoctor())) {
                //添加全科
                DoctorTeamMember wlyyDoctorTeamDoctor = new DoctorTeamMember();

                wlyyDoctorTeamDoctor.setTeam(doctorTeamCode);
                wlyyDoctorTeamDoctor.setMemberCode(sign.getDoctor());
                wlyyDoctorTeamDoctor.setName(sign.getDoctorName());
                wlyyDoctorTeamDoctor.setDel("1");
                wlyyDoctorTeamDoctor.setType(2);
                wlyyDoctorTeamDoctor.setSignType("2");//家庭签约
                wlyyDoctorTeamDoctor.setCode(getCode());
                wlyyDoctorTeamDoctor.setCzrq(new Date());

                teamMemberDao.save(wlyyDoctorTeamDoctor);
            }
            if (StringUtils.isNotEmpty(sign.getDoctorHealth())) {
                //添加健康管理师
                DoctorTeamMember wlyyDoctorTeamDoctor = new DoctorTeamMember();

                wlyyDoctorTeamDoctor.setTeam(doctorTeamCode);
                wlyyDoctorTeamDoctor.setMemberCode(sign.getDoctorHealth());
                wlyyDoctorTeamDoctor.setName(sign.getDoctorHealthName());
                wlyyDoctorTeamDoctor.setDel("1");
                wlyyDoctorTeamDoctor.setType(3);
                wlyyDoctorTeamDoctor.setSignType("2");//家庭签约
                wlyyDoctorTeamDoctor.setCode(getCode());
                wlyyDoctorTeamDoctor.setCzrq(new Date());

                teamMemberDao.save(wlyyDoctorTeamDoctor);
            }

            //添加患者和团队的关系
            DoctorTeamMember wlyyDoctorTeamPatient = new DoctorTeamMember();

            wlyyDoctorTeamPatient.setTeam(doctorTeamCode);
            wlyyDoctorTeamPatient.setMemberCode(sign.getPatient());
            wlyyDoctorTeamPatient.setName(sign.getName());
            wlyyDoctorTeamPatient.setDel("1");
            wlyyDoctorTeamPatient.setSignType("2");//家庭签约
            wlyyDoctorTeamPatient.setType(5);
            wlyyDoctorTeamPatient.setCode(getCode());
            wlyyDoctorTeamPatient.setCzrq(new Date());

            teamMemberDao.save(wlyyDoctorTeamPatient);

            if (StringUtils.isEmpty(sign.getIdcard())) {
                System.out.println("error:sign-family-set-group:no-idcard:" + sign.getId());
                continue;
            }

            int age = IdCardUtil.getAgeForIdcard(sign.getIdcard());
            String groupCode = "1";

            if (age >= 65) {
                groupCode = "3";
            }

            if (StringUtils.isNotEmpty(sign.getDoctorHealth())) {
                //把病人添加到健康管理师的健康分组里
                DoctorPatientGroupInfo doctorPatientGroupInfo = new DoctorPatientGroupInfo();

                doctorPatientGroupInfo.setCzrq(new Date());
                doctorPatientGroupInfo.setDoctor(sign.getDoctorHealth());
                doctorPatientGroupInfo.setStatus(1);
                doctorPatientGroupInfo.setPatient(sign.getPatient());
                doctorPatientGroupInfo.setPname(sign.getName());
                doctorPatientGroupInfo.setPartAmount(0);
                doctorPatientGroupInfo.setGroup(groupCode);//默认健康分组
                doctorPatientGroupInfo.setQyrq(sign.getApplyDate());
                doctorPatientGroupInfo.setSignType("2");//家庭签约

                groupInfoDao.save(doctorPatientGroupInfo);
            }

            if (StringUtils.isNotEmpty(sign.getDoctor())) {
                //把病人添加到全科医生的健康分组里
                DoctorPatientGroupInfo doctorPatientGroupInfo = new DoctorPatientGroupInfo();

                doctorPatientGroupInfo.setCzrq(new Date());
                doctorPatientGroupInfo.setDoctor(sign.getDoctor());
                doctorPatientGroupInfo.setStatus(1);
                doctorPatientGroupInfo.setPatient(sign.getPatient());
                doctorPatientGroupInfo.setPname(sign.getName());
                doctorPatientGroupInfo.setPartAmount(0);
                doctorPatientGroupInfo.setGroup(groupCode);//默认健康分组
                doctorPatientGroupInfo.setQyrq(sign.getApplyDate());
                doctorPatientGroupInfo.setSignType("2");//家庭签约

                groupInfoDao.save(doctorPatientGroupInfo);
            }

            List<DoctorPatientGroupInfo> groups = groupInfoDao.findPatientGroups(sign.getPatient());

            if (groups != null && groups.size() > 0) {
                for (DoctorPatientGroupInfo group : groups) {
                    if (StringUtils.isNotEmpty(group.getSignType()) && group.getSignType().equals("2")) {
                        continue;
                    }

                    DoctorPatientGroupInfo patientGroup = new DoctorPatientGroupInfo();

                    patientGroup.setCzrq(new Date());
                    patientGroup.setDoctor(group.getDoctor());
                    patientGroup.setStatus(1);
                    patientGroup.setPatient(sign.getPatient());
                    patientGroup.setPname(sign.getName());
                    patientGroup.setPartAmount(0);
                    patientGroup.setGroup(group.getGroup());
                    patientGroup.setQyrq(sign.getApplyDate());
                    patientGroup.setSignType("2");//家庭签约

                    groupInfoDao.save(patientGroup);
                }
            }
            sign.setTeamCode(doctorTeamCode);
            signFamilyDao.save(sign);
        }
    }

    /**
     * 执行某一条
     *
     * @param id
     */
    @Transactional
    public void setSignTeamAndGroupById(Long id) throws Exception {
        SignFamily sign = signFamilyDao.findOne(id);

        try {
            if (StringUtils.isNotEmpty(sign.getTeamCode())) {
                throw new Exception("error:sign-family-set-group:team-exist:" + id);
            }

            //建立团队
            DoctorTeam doctorTeam = new DoctorTeam();
            String doctorTeamCode = getCode();

            doctorTeam.setCode(doctorTeamCode);
            doctorTeam.setCzrq(new Date());
            doctorTeam.setName("团队名称:" + sign.getName());
            doctorTeam.setSignType("2");//家庭签约
            doctorTeam.setDel("1");

            teamDao.save(doctorTeam);

            //添加团队成员
            if (StringUtils.isNotEmpty(sign.getDoctor())) {
                //添加全科
                DoctorTeamMember wlyyDoctorTeamDoctor = new DoctorTeamMember();

                wlyyDoctorTeamDoctor.setTeam(doctorTeamCode);
                wlyyDoctorTeamDoctor.setMemberCode(sign.getDoctor());
                wlyyDoctorTeamDoctor.setName(sign.getDoctorName());
                wlyyDoctorTeamDoctor.setDel("1");
                wlyyDoctorTeamDoctor.setType(2);
                wlyyDoctorTeamDoctor.setSignType("2");//家庭签约
                wlyyDoctorTeamDoctor.setCode(getCode());
                wlyyDoctorTeamDoctor.setCzrq(new Date());

                teamMemberDao.save(wlyyDoctorTeamDoctor);
            }
            if (StringUtils.isNotEmpty(sign.getDoctorHealth())) {
                //添加健康管理师
                DoctorTeamMember wlyyDoctorTeamDoctor = new DoctorTeamMember();

                wlyyDoctorTeamDoctor.setTeam(doctorTeamCode);
                wlyyDoctorTeamDoctor.setMemberCode(sign.getDoctorHealth());
                wlyyDoctorTeamDoctor.setName(sign.getDoctorHealthName());
                wlyyDoctorTeamDoctor.setDel("1");
                wlyyDoctorTeamDoctor.setType(3);
                wlyyDoctorTeamDoctor.setSignType("2");//家庭签约
                wlyyDoctorTeamDoctor.setCode(getCode());
                wlyyDoctorTeamDoctor.setCzrq(new Date());

                teamMemberDao.save(wlyyDoctorTeamDoctor);
            }

            //添加患者和团队的关系
            DoctorTeamMember wlyyDoctorTeamPatient = new DoctorTeamMember();

            wlyyDoctorTeamPatient.setTeam(doctorTeamCode);
            wlyyDoctorTeamPatient.setMemberCode(sign.getPatient());
            wlyyDoctorTeamPatient.setName(sign.getName());
            wlyyDoctorTeamPatient.setDel("1");
            wlyyDoctorTeamPatient.setSignType("2");//家庭签约
            wlyyDoctorTeamPatient.setType(5);
            wlyyDoctorTeamPatient.setCode(getCode());
            wlyyDoctorTeamPatient.setCzrq(new Date());

            teamMemberDao.save(wlyyDoctorTeamPatient);

            if (StringUtils.isEmpty(sign.getIdcard())) {
                System.out.println("error:sign-family-set-group:no-idcard:" + sign.getId());
            }

            int age = IdCardUtil.getAgeForIdcard(sign.getIdcard());
            String groupCode = "1";

            if (age >= 65) {
                groupCode = "3";
            }

            if (StringUtils.isNotEmpty(sign.getDoctorHealth())) {
                //把病人添加到健康管理师的健康分组里
                DoctorPatientGroupInfo doctorPatientGroupInfo = new DoctorPatientGroupInfo();

                doctorPatientGroupInfo.setCzrq(new Date());
                doctorPatientGroupInfo.setDoctor(sign.getDoctorHealth());
                doctorPatientGroupInfo.setStatus(1);
                doctorPatientGroupInfo.setPatient(sign.getPatient());
                doctorPatientGroupInfo.setPname(sign.getName());
                doctorPatientGroupInfo.setPartAmount(0);
                doctorPatientGroupInfo.setGroup(groupCode);//默认健康分组
                doctorPatientGroupInfo.setQyrq(sign.getApplyDate());
                doctorPatientGroupInfo.setSignType("2");//家庭签约

                groupInfoDao.save(doctorPatientGroupInfo);
            }

            if (StringUtils.isNotEmpty(sign.getDoctor())) {
                //把病人添加到全科医生的健康分组里
                DoctorPatientGroupInfo doctorPatientGroupInfo = new DoctorPatientGroupInfo();

                doctorPatientGroupInfo.setCzrq(new Date());
                doctorPatientGroupInfo.setDoctor(sign.getDoctor());
                doctorPatientGroupInfo.setStatus(1);
                doctorPatientGroupInfo.setPatient(sign.getPatient());
                doctorPatientGroupInfo.setPname(sign.getName());
                doctorPatientGroupInfo.setPartAmount(0);
                doctorPatientGroupInfo.setGroup(groupCode);//默认健康分组
                doctorPatientGroupInfo.setQyrq(sign.getApplyDate());
                doctorPatientGroupInfo.setSignType("2");//家庭签约

                groupInfoDao.save(doctorPatientGroupInfo);
            }

            List<DoctorPatientGroupInfo> groups = groupInfoDao.findPatientGroups(sign.getPatient());

            if (groups != null && groups.size() > 0) {
                for (DoctorPatientGroupInfo group : groups) {
                    if (StringUtils.isNotEmpty(group.getSignType()) && group.getSignType().equals("2")) {
                        continue;
                    }

                    DoctorPatientGroupInfo patientGroup = new DoctorPatientGroupInfo();

                    patientGroup.setCzrq(new Date());
                    patientGroup.setDoctor(group.getDoctor());
                    patientGroup.setStatus(1);
                    patientGroup.setPatient(sign.getPatient());
                    patientGroup.setPname(sign.getName());
                    patientGroup.setPartAmount(0);
                    patientGroup.setGroup(group.getGroup());
                    patientGroup.setQyrq(sign.getApplyDate());
                    patientGroup.setSignType("2");//家庭签约

                    groupInfoDao.save(patientGroup);
                }
            }
            sign.setTeamCode(doctorTeamCode);
            signFamilyDao.save(sign);
        } catch (Exception e) {
            e.printStackTrace();
            errorSigns.add(sign.getId());
            throw new Exception(e.getMessage());
        }
    }

    @Transactional
    public void transformEduArticle() {
        Iterable<HealthEduArticle> articles = healthEduArticleDao.findAll();

        for (HealthEduArticle article : articles) {
            String content = article.getContent();
            content = content.replaceAll("</?[^>]+>", "")
                    .replaceAll("<a>\\s*|\t|\r|\n</a>", "")
                    .replaceAll("&nbsp;", "").replaceAll(" ",""); //剔出<html>的标签
            article.setSummary(content.length() > 50 ? content.substring(0, 49) : content);
        }
    }
}
