package cms.service.follow.impl;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.persistence.Query;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import cms.bean.QueryResult;
import cms.bean.follow.Follow;
import cms.bean.follow.Follower;
import cms.service.besa.DaoSupport;
import cms.service.follow.FollowService;
import cms.web.action.follow.FollowConfig;
import cms.web.action.follow.FollowerConfig;
import net.sf.cglib.beans.BeanCopier;

/**
 * 关注
 *
 */
@Service
@Transactional
public class FollowServiceBean extends DaoSupport<Follow> implements FollowService{
	private static final Logger logger = LogManager.getLogger(FollowServiceBean.class);
	
	@Resource FollowConfig followConfig;
	@Resource FollowerConfig followerConfig;
	
	
	/**
	 * 根据Id查询关注
	 * @param followId 关注Id
	 * @return
	 */
	@Transactional(readOnly=true, propagation=Propagation.NOT_SUPPORTED)
	public Follow findById(String followId){
		//表编号
		int tableNumber = followConfig.followIdRemainder(followId);
		
		if(tableNumber == 0){//默认对象
			Query query = em.createQuery("select o from Follow o where o.id=?1")
			.setParameter(1, followId);
			List<Follow> list = query.getResultList();
			for(Follow p : list){
				return p;
			}
			
		}else{//带下划线对象
			Query query = em.createQuery("select o from Follow_"+tableNumber+" o where o.id=?1")
			.setParameter(1, followId);
			List<?> follow_List= query.getResultList();
			
			try {
				//带下划线对象
				Class<?> c = Class.forName("cms.bean.follow.Follow_"+tableNumber);
				Object object  = c.newInstance();
				BeanCopier copier = BeanCopier.create(object.getClass(),Follow.class, false); 
				
				for(int j = 0;j< follow_List.size(); j++) {  
					Object obj = follow_List.get(j);
					Follow follow = new Follow();
					copier.copy(obj,follow, null);
					return follow;
				}
				
				
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
			//	e.printStackTrace();
				if (logger.isErrorEnabled()) {
		            logger.error("根据Id查询关注",e);
		        }
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
				if (logger.isErrorEnabled()) {
		            logger.error("根据Id查询关注",e);
		        }
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
			//	e.printStackTrace();
				if (logger.isErrorEnabled()) {
		            logger.error("根据Id查询关注",e);
		        }
			}
		}
		return null;
	}
	
	/**
	 * 根据用户名称查询所有关注
	 * @param userId 用户Id
	 * @param userName 用户名称
	 * @return
	 */
	@Transactional(readOnly=true, propagation=Propagation.NOT_SUPPORTED)
	public List<Follow> findAllFollow(Long userId,String userName){
		//表编号
		int tableNumber = followConfig.userIdRemainder(userId);
		Query query  = null;
		
		if(tableNumber == 0){//默认对象
			query = em.createQuery("select o from Follow o where o.userName=?1");
			query.setParameter(1, userName);
			List<Follow> followList= query.getResultList();
			return followList;
		}else{//带下划线对象
			
			query = em.createQuery("select o from Follow_"+tableNumber+" o where o.userName=?1");
			query.setParameter(1, userName);
			List<?> follow_List= query.getResultList();
			try {
				//带下划线对象
				Class<?> c = Class.forName("cms.bean.follow.Follow_"+tableNumber);
				Object object  = c.newInstance();
				BeanCopier copier = BeanCopier.create(object.getClass(),Follow.class, false); 
				List<Follow> followList= new ArrayList<Follow>();
				for(int j = 0;j< follow_List.size(); j++) {  
					Object obj = follow_List.get(j);
					Follow follow = new Follow();
					copier.copy(obj,follow, null);
					followList.add(follow);
				}
				return followList;
				
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
			//	e.printStackTrace();
				if (logger.isErrorEnabled()) {
		            logger.error("根据用户名称查询所有关注",e);
		        }
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
			//	e.printStackTrace();
				if (logger.isErrorEnabled()) {
		            logger.error("根据用户名称查询所有关注",e);
		        }
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
			//	e.printStackTrace();
				if (logger.isErrorEnabled()) {
		            logger.error("根据用户名称查询所有关注",e);
		        }
			}

			
		}
		
		return null;
		
	}
	
	/**
	 * 根据用户名称查询关注分页
	 * @param userId 用户Id
	 * @param userName 用户名称
	 * @param firstIndex 索引开始,即从哪条记录开始
	 * @param maxResult 获取多少条数据
	 * @return
	 */
	@Transactional(readOnly=true, propagation=Propagation.NOT_SUPPORTED)
	public QueryResult<Follow> findFollowByUserName(Long userId,String userName,int firstIndex, int maxResult){
		QueryResult<Follow> qr = new QueryResult<Follow>();
		
		//表编号
		int tableNumber = followConfig.userIdRemainder(userId);
		Query query  = null;
		
		if(tableNumber == 0){//默认对象
			
			query = em.createQuery("select o from Follow o where o.userName=?1 ORDER BY o.addtime desc");
			query.setParameter(1, userName);
			//索引开始,即从哪条记录开始
			query.setFirstResult(firstIndex);
			//获取多少条数据
			query.setMaxResults(maxResult);
			List<Follow> followList= query.getResultList();
			qr.setResultlist(followList);
			
			query = em.createQuery("select count(o) from Follow o where o.userName=?1");
			query.setParameter(1, userName);
			qr.setTotalrecord((Long)query.getSingleResult());
		}else{//带下划线对象
			
			query = em.createQuery("select o from Follow_"+tableNumber+" o where o.userName=?1 ORDER BY o.addtime desc");
			query.setParameter(1, userName);
			//索引开始,即从哪条记录开始
			query.setFirstResult(firstIndex);
			//获取多少条数据
			query.setMaxResults(maxResult);
			List<?> follow_List= query.getResultList();
			
			
			
			try {
				//带下划线对象
				Class<?> c = Class.forName("cms.bean.follow.Follow_"+tableNumber);
				Object object  = c.newInstance();
				BeanCopier copier = BeanCopier.create(object.getClass(),Follow.class, false); 
				List<Follow> followList= new ArrayList<Follow>();
				for(int j = 0;j< follow_List.size(); j++) {  
					Object obj = follow_List.get(j);
					Follow follow = new Follow();
					copier.copy(obj,follow, null);
					followList.add(follow);
				}
				qr.setResultlist(followList);
				
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
			//	e.printStackTrace();
				if (logger.isErrorEnabled()) {
		            logger.error("根据用户名称查询关注分页",e);
		        }
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
			//	e.printStackTrace();
				if (logger.isErrorEnabled()) {
		            logger.error("根据用户名称查询关注分页",e);
		        }
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
			//	e.printStackTrace();
				if (logger.isErrorEnabled()) {
		            logger.error("根据用户名称查询关注分页",e);
		        }
			}
			
			query = em.createQuery("select count(o) from Follow_"+tableNumber+" o where o.userName=?1");
			query.setParameter(1, userName);
			qr.setTotalrecord((Long)query.getSingleResult());
			
		}
		
		return qr;
	}
	
	/**
	 * 根据用户名称查询粉丝分页
	 * @param userId 用户Id
	 * @param userName 用户名称
	 * @param firstIndex 索引开始,即从哪条记录开始
	 * @param maxResult 获取多少条数据
	 * @return
	 */
	@Transactional(readOnly=true, propagation=Propagation.NOT_SUPPORTED)
	public QueryResult<Follower> findFollowerByUserName(Long userId,String userName,int firstIndex, int maxResult){
		QueryResult<Follower> qr = new QueryResult<Follower>();
		
		//表编号
		int tableNumber = followConfig.userIdRemainder(userId);
		Query query  = null;
		
		if(tableNumber == 0){//默认对象
			
			query = em.createQuery("select o from Follower o where o.userName=?1 ORDER BY o.addtime desc");
			query.setParameter(1, userName);
			//索引开始,即从哪条记录开始
			query.setFirstResult(firstIndex);
			//获取多少条数据
			query.setMaxResults(maxResult);
			List<Follower> followerList= query.getResultList();
			qr.setResultlist(followerList);
			
			query = em.createQuery("select count(o) from Follower o where o.userName=?1");
			query.setParameter(1, userName);
			qr.setTotalrecord((Long)query.getSingleResult());
		}else{//带下划线对象
			
			query = em.createQuery("select o from Follower_"+tableNumber+" o where o.userName=?1 ORDER BY o.addtime desc");
			query.setParameter(1, userName);
			//索引开始,即从哪条记录开始
			query.setFirstResult(firstIndex);
			//获取多少条数据
			query.setMaxResults(maxResult);
			List<?> follower_List= query.getResultList();
			
			
			
			try {
				//带下划线对象
				Class<?> c = Class.forName("cms.bean.follow.Follower_"+tableNumber);
				Object object  = c.newInstance();
				BeanCopier copier = BeanCopier.create(object.getClass(),Follower.class, false); 
				List<Follower> followerList= new ArrayList<Follower>();
				for(int j = 0;j< follower_List.size(); j++) {  
					Object obj = follower_List.get(j);
					Follower follower = new Follower();
					copier.copy(obj,follower, null);
					followerList.add(follower);
				}
				qr.setResultlist(followerList);
				
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
			//	e.printStackTrace();
				if (logger.isErrorEnabled()) {
		            logger.error("根据用户名称查询粉丝分页",e);
		        }
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
			//	e.printStackTrace();
				if (logger.isErrorEnabled()) {
		            logger.error("根据用户名称查询粉丝分页",e);
		        }
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
			//	e.printStackTrace();
				if (logger.isErrorEnabled()) {
		            logger.error("根据用户名称查询粉丝分页",e);
		        }
			}
			
			query = em.createQuery("select count(o) from Follower_"+tableNumber+" o where o.userName=?1");
			query.setParameter(1, userName);
			qr.setTotalrecord((Long)query.getSingleResult());
			
		}
		
		return qr;
	}
	
	
	/**
	 * 保存关注
	 * @param follow 关注
	 * @param follower 粉丝
	 */
	public void saveFollow(Object follow,Object follower){
		this.save(follow);
		this.save(follower);
	}
	
	/**
	 * 删除关注
	 * @param followId 关注Id
	 * @param followerId 粉丝Id
	 */
	public Integer deleteFollow(String followId,String followerId){
		//表编号
		int follow_tableNumber = followConfig.followIdRemainder(followId);
		int i = 0;
		if(follow_tableNumber == 0){//默认对象
			Query delete = em.createQuery("delete from Follow o where o.id=?1")
			.setParameter(1,followId);
			i += delete.executeUpdate();
		}else{//带下划线对象
			Query delete = em.createQuery("delete from Follow_"+follow_tableNumber+" o where o.id=?1")
					.setParameter(1,followId);
					i += delete.executeUpdate();
		}
		
		
		int follower_tableNumber = followerConfig.followerIdRemainder(followerId);
		if(follower_tableNumber == 0){//默认对象
			Query delete = em.createQuery("delete from Follower o where o.id=?1")
			.setParameter(1,followerId);
			i += delete.executeUpdate();
		}else{//带下划线对象
			Query delete = em.createQuery("delete from Follower_"+follower_tableNumber+" o where o.id=?1")
					.setParameter(1,followerId);
					i += delete.executeUpdate();
		}
		
		
		return i;
	}
	
	/**
	 * 根据用户名称删除关注
	 * @param userNameList 用户名称集合
	 */
	public Integer deleteFollowByUserName(List<String> userNameList){
		int j = 0;
		//表编号
		int follow_tableNumber = followConfig.getTableQuantity();
		for(int i = 0; i<follow_tableNumber; i++){
			if(i == 0){//默认对象
				Query query = em.createQuery("delete from Follow o where o.userName in(:userName)")
						.setParameter("userName", userNameList);
				j += query.executeUpdate();
				
			}else{//带下划线对象
				Query query = em.createQuery("delete from Follow_"+i+" o where o.userName in(:userName)")
						.setParameter("userName", userNameList);
				j += query.executeUpdate();
			}
		}
		
		//表编号
		int follower_tableNumber = followerConfig.getTableQuantity();
		for(int i = 0; i<follower_tableNumber; i++){
			if(i == 0){//默认对象
				Query query = em.createQuery("delete from Follower o where o.userName in(:userName)")
						.setParameter("userName", userNameList);
				j += query.executeUpdate();
				
			}else{//带下划线对象
				Query query = em.createQuery("delete from Follower_"+i+" o where o.userName in(:userName)")
						.setParameter("userName", userNameList);
				j += query.executeUpdate();
			}
		}
		
		return j;
	}
	

	/**
	 * 根据用户名称查询粉丝数量
	 * @param userId 用户Id
	 * @param userName 用户名称
	 * @return
	 */
	@Transactional(readOnly=true, propagation=Propagation.NOT_SUPPORTED)
	public Long findFollowerCountByUserName(Long userId,String userName){
		Long count = 0L;
		//表编号
		int tableNumber = followerConfig.userIdRemainder(userId);
		Query query  = null;
		
		if(tableNumber == 0){//默认对象
			query = em.createQuery("select count(o) from Follower o where o.userName=?1");
			query.setParameter(1, userName);
			count = (Long)query.getSingleResult();
			
		}else{//带下划线对象
			query = em.createQuery("select count(o) from Follower_"+tableNumber+" o where o.userName=?1");
			query.setParameter(1, userName);
			count = (Long)query.getSingleResult();
		}
		return count;
	}
	
	/**
	 * 根据用户名称查询关注数量
	 * @param userId 用户Id
	 * @param userName 用户名称
	 * @return
	 */
	@Transactional(readOnly=true, propagation=Propagation.NOT_SUPPORTED)
	public Long findFollowCountByUserName(Long userId,String userName){
		Long count = 0L;
		//表编号
		int tableNumber = followConfig.userIdRemainder(userId);
		Query query  = null;
		
		if(tableNumber == 0){//默认对象
			query = em.createQuery("select count(o) from Follow o where o.userName=?1");
			query.setParameter(1, userName);
			count = (Long)query.getSingleResult();
			
		}else{//带下划线对象
			query = em.createQuery("select count(o) from Follow_"+tableNumber+" o where o.userName=?1");
			query.setParameter(1, userName);
			count = (Long)query.getSingleResult();
		}
		return count;
	}
}