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.DoctorTeamMember;
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.patient.SignFamilyDao;
import com.yihu.wlyy.util.IdCardUtil;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.UUID;

/**
 * Created by lyr-pc on 2016/10/11.
 */
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Service
public class SignTeamAndGroupRunnable implements Runnable {

    long start = 0;
    long end = 0;

    @Autowired
    SignFamilyDao signFamilyDao;
    @Autowired
    DoctorPatientGroupInfoDao groupInfoDao;
    @Autowired
    DoctorTeamDao teamDao;
    @Autowired
    DoctorTeamMemberDao teamMemberDao;
    @Autowired
    JpaTransactionManager transactionManager;

    public SignTeamAndGroupRunnable(Long start,Long end){
        this.start = start;
        this.end = end;
    }

    public SignTeamAndGroupRunnable() {

    }

    public long getStart() {
        return start;
    }

    public SignTeamAndGroupRunnable setStart(long start) {
        this.start = start;
        return this;
    }

    public long getEnd() {
        return end;
    }

    public SignTeamAndGroupRunnable setEnd(long end) {
        this.end = end;
        return this;
    }

    public String getCode() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }

    @Override
    public void run() {
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        boolean flag = true;

        while (flag) {

            PageRequest pageRequest = new PageRequest(0, 500);
            Page<SignFamily> signs = signFamilyDao.findByTypeAndSignSourceAndId(2, "1",start, end,pageRequest);

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

            DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别，开启新事务
            TransactionStatus status = transactionManager.getTransaction(def); // 获得事务状态
            try {
                transform(signs);
                //事物提交
                transactionManager.commit(status);
            } catch (Exception e) {
                transactionManager.rollback(status);
            }

            start = start + 500;
        }
    }

    public void transform(Page<SignFamily> signs){
        System.out.println("sign-patient-group-team:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));

        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();
            }
        }
        System.out.println("sign-patient-group-team:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }
}
