package org.ccpit.base.role;

import org.apache.commons.lang.StringUtils;
import org.ccpit.base.controller.Convert;
import org.ccpit.base.controller.Page;
import org.ccpit.base.controller.PageBo;
import org.ccpit.base.controller.PageRequest;
import org.ccpit.base.utils.UrlRolesMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.transaction.Transactional;

import java.util.*;

/**
 * 
 * ClassName: RoleService <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason: TODO ADD REASON(可选). <br/>
 * date: 2015年4月14日 下午1:45:05 <br/>
 *
 * @author dingwei
 * @version 
 * @since JDK 1.6
 */
@Repository
@Transactional
public class RoleService {
    @Autowired
    private RoleDao roleDao;
    @Autowired
    private UrlRolesMapper mapper;

    public boolean addRole(String roleName, String url,String description) {
        Role role = new Role();
        role.setRoleName(roleName);
        role.setDescription(description);
        List<RoleUrl> urlList = new ArrayList<RoleUrl>();
        for (String u : url.split(",")) {
            RoleUrl ru = new RoleUrl();
            ru.setUrl(u);
            urlList.add(ru);
        }
        role.setUrlPerfixs(urlList);
        return roleDao.save(role);
    }

    public boolean addRole(Role role) {
        boolean result = roleDao.save(role);
        if (result){
        	mapper.reload();
        }
        return result;
    }

    public boolean editRole(long id,String roleName,String urlPrefixs,String description) {
        Role role = roleDao.queryById(id);
        urlPrefixs = getPriId(urlPrefixs);
        if (role!=null){
        	if(null != roleName && !"".equals(roleName)){
        		role.setRoleName(roleName);
        	}
        	if(null != roleName && !"".equals(description)){
        		role.setDescription(description);
        	}
            List<RoleUrl> urlList = new ArrayList<RoleUrl>();
            for (String u : urlPrefixs.split(",")) {
                RoleUrl ru = new RoleUrl();
                ru.setUrl(u);
                urlList.add(ru);
            }
            role.setUrlPerfixs(urlList);
            boolean result = roleDao.update(role);
            if (result)
                mapper.reload();
            return result;
        }
        return false;
    }

    public boolean updateRole(Role role){
    	return roleDao.update(role);
    }
    
    public boolean deleteRole(long id) {
        boolean result = roleDao.deleteById(id);
        if (result){
        	mapper.reload();
        }
        return result;
    }

    public Role get(long id) {
        return roleDao.queryById(id);
    }

    public Page<Role> getAll(PageRequest pr) {
        return roleDao.findPage(pr, "from " + Role.class.getName(), null);
    }
    
    public Page<Role> getAll(PageRequest pr,String hql) {
        return roleDao.findPage(pr, hql, null);
    }

    public List<Role> getAll(String hql) {
        return roleDao.query(hql);
    }


    public List<Role> getAllRoles(){
    	return roleDao.queryAll();
    }
    
    public Map<String,Object> convertToMap(Role role){
        Map<String,Object> map = new HashMap<String, Object>();
        if (role==null)
            return map;
        List<String> urls = new ArrayList<String>();
        for (RoleUrl roleUrl:role.getUrlPerfixs()){
            urls.add(roleUrl.getUrl());
        }
        map.put("urlPrefixs", StringUtils.join(urls,","));
        map.put("roleName",role.getRoleName());
        map.put("id",role.getId());
        map.put("urlPerfixs",urls);
        map.put("description",role.getDescription());
        return map;
    }

    public PageBo<Role> convert(Page<Role> page){
        return new PageBo<Role>(page, new Convert<Role>() {
            @Override
            public Map<String, Object> convert(Role obj) {
                return convertToMap(obj);
            }
        });
    }

    /**
     * 根据url查找role
     * @param url
     * @return
     */
    public Role findRoleByUrl(String url){
        return roleDao.getRoleByUrl(url);
    }
    
    //去掉重复priId
	private String getPriId(String priIds){
		List list = new ArrayList();
		String[] str = priIds.split(",");
		if(null != str && !"".equals(str)){
			for(int i=0; i<str.length;i++){
				if(!list.contains(str[i])){
					list.add(str[i]);
				}
			}
		}
		String priId = "";
		if(null != list && list.size()>0){
			for(int j=0;j<list.size();j++){
				String id = (String) list.get(j);
				priId += id + ",";
			}
		}
		return priId.substring(0, priId.length()-1);
	}
}