package com.sdudoc.dao.impl;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.sdudoc.bean.User;
import com.sdudoc.dao.UserDao;
import com.sdudoc.utils.MD5;
import com.sdudoc.utils.Pager;

@SuppressWarnings("unchecked")
@Repository("userDao")
public class UserDaoImpl implements UserDao {

	@Autowired
	private SessionFactory sessionFactory;

	@Override
	public void addUser(User user) {
		Session session = sessionFactory.getCurrentSession();
		user.setPassword(MD5.md5_base64(user.getPassword()));
		session.save(user);
	}

	@Override
	public void updateUser(User user) {
		Session session = sessionFactory.getCurrentSession();
		session.saveOrUpdate(user);
	}
	
	@Override
	public boolean deleteUserById(int userId, int group) {
		String sql = "delete from User where id=:id and group<:group";
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createQuery(sql);
		query.setInteger("id", userId);
		query.setInteger("group", group);
		int  num = query.executeUpdate();
		if(num > 0)
			return true;
		return false;
	}

	
	@Override
	public User getUserByEmail(String email) {
		String sql = "from User where email=:email";
		//String sql = "select id from User where email=:email";
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createQuery(sql);
		query.setString("email", email);
		List<User> users = query.list();
		if (users.size() == 0) {
			return null;
		} else {
			return users.get(0);
		}
	}

	@Override
	public User getUserByName(String username) {
		String sql = "from User where username=:username";
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createQuery(sql);
		query.setString("username", username);
		List<User> users = query.list();
		if (users.size() == 0) {
			return null;
		} else {
			return users.get(0);
		}
	}

	@Override
	public User getUserByName$Pw(String username, String password) {
		String sql = "from User where username=:username and password=:password";
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createQuery(sql);
		query.setString("username", username);
		query.setString("password", password);
		List<User> users = query.list();
		if(users.size() == 0) {
			return null;
		}
		return users.get(0);
	}

	@Override
	public Pager<User> listUserByPage(int pageNo, int pageSize) {
		Session session = sessionFactory.getCurrentSession();
		Criteria criteria = session.createCriteria(User.class);
		long recordTotal = ((Long) criteria.setProjection(Projections.rowCount()).uniqueResult()).longValue();
		criteria.setProjection(null);
		criteria.addOrder(Order.desc("registerDate"));
		criteria.setFirstResult((pageNo - 1) * pageSize);
		criteria.setMaxResults(pageSize);
		List<User> results = criteria.list();
		return new Pager<User>(pageSize, pageNo, recordTotal, results);
	}
}