package jp.co.y_net.amm.service;

import java.util.List;

import jp.co.y_net.amm.common.AppLogger;
import jp.co.y_net.amm.common.AppUtils;
import jp.co.y_net.amm.dao.AppDef;
import jp.co.y_net.amm.dao.Pwtckt;
import jp.co.y_net.amm.dao.PwtcktDao;

import org.apache.commons.lang.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component("passwordTicketManager")
public class PasswordTicketManager {
    
    @Autowired(required = true)
    @Qualifier("pwtcktDao")
    private PwtcktDao pwtcktDao;
    
    public String execute新規パスワード発行(Integer usrid) {
        return execute(usrid, 60*60* AppDef.新規パスワード発行の登録有効期間);
    }

    public String executeパスワードリセット(Integer usrid) {
        return execute(usrid, 60*60* AppDef.パスワードリセット後のパスワード登録有効期間);
    }

    public String execute(Integer usrid, int ticketdateOffset) {
        /* 　同じユーザIDで「受付中」レコードを処理 */
        {
            Pwtckt cnd = new Pwtckt();
            cnd.setUsrid(usrid);
            cnd.setStatus(Pwtckt.STATUS_受付中);
            
            List<Pwtckt> tickets = pwtcktDao.get(cnd);
            for(Pwtckt tiket: tickets) {
                tiket.setStatus(Pwtckt.STATUS_中止);
                tiket.setCanceldate(AppUtils.createNowLong());
                pwtcktDao.update(tiket, AppDef.USERID_NONE); // 【更新処理】
                /* 論理削除実施 */
                pwtcktDao.removeLogical(tiket, AppDef.USERID_NONE); // 【更新処理】
            }
        }
        /* 　同じユーザIDで「有効期限切れ」レコードを処理 */
        {
            Pwtckt cnd = new Pwtckt();
            cnd.setUsrid(usrid);
            cnd.setStatus(Pwtckt.STATUS_有効期限切れ);
            
            List<Pwtckt> tickets = pwtcktDao.get(cnd);
            for(Pwtckt tiket: tickets) {
//                tiket.setStatus(Pwtckt.STATUS_XXX); // ステータス変更なし
//                tiket.setCanceldate(AppUtils.createNowLong());
//                tiket.setDeleted(AppDef.TRUE); // 論理削除
//                pwtcktDao.update(tiket);
                pwtcktDao.removeLogical(tiket, AppDef.USERID_NONE); // 【更新処理】
            }
        }
        /* 　チケット発行(同一の値が存在する場合は再計算) */
        String random = null;
        for (int i = 0; i < 100; i++) {
            random = RandomStringUtils.randomAlphabetic(16);
            Pwtckt cnd = new Pwtckt();
            cnd.setTicket(random);
            if(pwtcktDao.get(cnd).isEmpty()) {
                break;
            }
        }
        if(random == null) {
            throw new RuntimeException("チケットが決定しませんでした。無限ループ防止のため、処理を中止します。");
        }
        Pwtckt ticket = new Pwtckt();
        ticket.setUsrid(usrid);
        ticket.setTicket(random);
        ticket.setCreatedate(AppUtils.createNowLong());
        ticket.setTicketdate(AppUtils.createNowLong(ticketdateOffset)); // x時間後
        ticket.setStatus(Pwtckt.STATUS_受付中);
        pwtcktDao.add(ticket, AppDef.USERID_NONE); // 【更新処理】
        
        return random;
    }

    public Pwtckt getユーザに紐づくチケット(Integer usrid) {
        Pwtckt ticket = new Pwtckt();
        ticket.setUsrid(usrid);
        ticket.setStatus(Pwtckt.STATUS_受付中);
        List<Pwtckt> results = pwtcktDao.get(ticket);
        if(results.isEmpty()) {
            return null;
        }
        if(results.size() != 1) {
            AppLogger.error("1つのユーザに紐づく、受付中のチケットが複数件、検出されました。");
            return null;
        }
        return results.get(0);
    }



}
