package jp.co.y_net.amm.dao;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;


@Component("usrDao")
public class UsrDao extends AbstractDao {
    
    /* 参照形処理 ------------------------------------------------------------------------------------------------ */
    /** ユニークキーを使用した取得 */
    public Usr getByUsrid(Integer usrid) {
        Usr cnd = new Usr();
        cnd.setUsrid(usrid);
        List<Usr> usrs = get(cnd);
        if(usrs.size() == 1) {
            return usrs.get(0);
        }
        return null;
    }
    /** 全件取得(論理削除除外) */
    public List<Usr> get() {
        Usr cnd = new Usr();
        cnd.setDeleted(AppDef.FLASE); // 論理削除考慮
        return get(cnd);
    }
    /** 条件付き取得(論理削除除外) */
    public List<Usr> get(Usr cnd) {
        if(cnd != null) {
            cnd.setDeleted(AppDef.FLASE); // 論理削除考慮
        }
        HibernateTemplate hibernateTemplate = getHibernateTemplate();
        DetachedCriteria dc = DetachedCriteria.forClass(Usr.class);
        dc.add(Example.create(cnd));
        @SuppressWarnings("unchecked")
        List<Usr> list = (List<Usr>) hibernateTemplate.findByCriteria(dc);
        hibernateTemplate.clear();
        return list;
    }
    
    /* 登録系 ----------------------------------------------------------------------------------------------------*/
    private static final String ENTITYNAME = "Usr";
    private static final String PKEYNAME = "usrid";
    /**
     * 登録処理
     * ・必要なカラムを自動採番する
     * ・共通処理を実施する。
     * @param item
     */
    public void add(Usr item, Integer updateusrid) {
        /* 自動採番 */
        item.setUsrid(getNextId(ENTITYNAME, PKEYNAME));
        /* Insert実施 */
        super.add(item, updateusrid);
    }
    public void update(Usr item, Integer updateusrid) {
        super.update(item, updateusrid);
    }
    public void removeLogical(Usr item, Integer updateusrid) {
        super.removeLogical(item, updateusrid);
    }
    
    /* entity固有のユーティリティ ----------------------------------------------------------------------------------- */
    /**
     * ログインIDによる検索
     * ・論理削除は除く
     * ・複数件取得できる場合は、退会していないレコード
     * @param loginid 
     * @return
     */
    public Usr getByLoginid(String loginid) {
        Usr cnd = new Usr();
        cnd.setLoginid(loginid);
        List<Usr> usrs = get(cnd);
        
        if(usrs.size() == 1) {
            return usrs.get(0);
        }
        /* 複数件取得できる場合は、退会していないレコード */
        for(Usr usr: usrs) {
            if(Usr.STATUS_退会 != usr.getStatus()) {
                return usr;
            }
        }
        return null;
    }
    /**
     * 条件を指定した検索
     * ・論理削除は除く
     * @param cnd 絞り込み条件
     * @param cndNot 否定条件
     * @return 検索結果
     */
    public List<Usr> get(Usr cnd, Usr cndNot) {
        if(cnd != null) {
            cnd.setDeleted(AppDef.FLASE); // 論理削除考慮
        }
        HibernateTemplate hibernateTemplate = getHibernateTemplate();
        DetachedCriteria dc = DetachedCriteria.forClass(Usr.class);
        dc.add(Example.create(cnd));
        dc.add(Restrictions.not(Example.create(cndNot)));
        @SuppressWarnings("unchecked")
        List<Usr> list = (List<Usr>) hibernateTemplate.findByCriteria(dc);
        hibernateTemplate.clear();
        return list;
    }
}
