package jp.co.y_net.amm.dao;

import java.util.List;

import jp.co.y_net.amm.common.AppUtils;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;

/**
 * WebopacDao
 * @version 1.0.0
 * @author k_ohara
 */
@Component("abstractDao")
abstract class AbstractDao extends HibernateDaoSupport {
    

    
    /**
     * sessionFactoryのインジェクションを行う
     * @param sessionFactory
     */
    @Autowired(required = true)
    @Qualifier("sessionFactory_Amm") // ← hibernateContextBase.xmlにて宣言されている
    public void init(SessionFactory sessionFactory){
        super.setSessionFactory(sessionFactory);
    }
    /**
     * 追加対象オブジェクト
     * @param item 対象オブジェクト
     * @param updateusrid 更新者ID
     */
    protected void add(AppDto item, Integer updateusrid) {
        if(item.getId() != null) {
            throw new RuntimeException("追加対象のオブジェクトに主キーが設定されています。");
        }
        
        /* 共通項目の登録 */
        if(item != null) {
            item.setUpdatedate(AppUtils.createNowLong()); // 更新日付を設定
            item.setUpdateusrid(updateusrid); // 更新者IDを設定
            item.setDeleted(AppDef.FLASE); // 削除フラグをFalse
        }
        
        try {
            HibernateTemplate hibernateTemplate = getHibernateTemplate();
            hibernateTemplate.save(item);
            hibernateTemplate.flush();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 更新処理
     * @param item 対象オブジェクト
     * @param updateusrid 更新者ID
     */
    protected void update(AppDto item, Integer updateusrid) {
        if(item.getId() == null) {
            throw new RuntimeException("追加対象のオブジェクトに主キーが設定されていません。");
        }
        
        /* 共通項目 「更新日付」の登録 */
        if(item != null) {
            item.setUpdatedate(AppUtils.createNowLong()); // 更新日付を設定
            item.setUpdateusrid(updateusrid); // 更新者IDを設定
        }
        
        try {
            HibernateTemplate hibernateTemplate = getHibernateTemplate();

            hibernateTemplate.update(item);
            hibernateTemplate.flush();
            
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 論理削除処理
     * @param item 対象オブジェクト
     * @param updateusrid 更新者ID
     */
    protected void removeLogical(AppDto item, Integer updateusrid) {
        item.setDeleted(AppDef.TRUE);
        this.update(item, updateusrid);
    }
    /**
     * 物理削除処理
     */
    protected void remove(AppDto item) {
        throw new RuntimeException("本アプリケーションでは物理削除を行わない。");
    }
    
    /**
     * 集合関数 MAX を使用して次に採番すべき値を取得する
     * @param entityname
     * @param colname
     * @return
     */
    public Integer getNextId(String entityname, String colname) {
        return getNextId(entityname, colname, 1);
    }
    public Integer getNextId(String entityname, String colname, int init) {
        Session session = getSessionFactory().openSession();
        Query query = session.createQuery("SELECT max(" + colname + ") from " + entityname + "");
        @SuppressWarnings("rawtypes")
        List list = query.list();
        Integer currentId = 0;
        Integer nextId;
        if(list != null && list.isEmpty() == false && (Integer)list.get(0) != null) {
            currentId = (Integer)list.get(0);
            nextId = currentId + 1;
        } else {
            nextId = init;
        }
        session.close();
        return nextId;
    }

}
