package jp.agentec.sinaburocast.service;

import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Properties;

import javax.mail.MessagingException;

import jp.agentec.sinaburocast.common.SinaburoConstant;
import jp.agentec.sinaburocast.common.util.MailUtil;
import jp.agentec.sinaburocast.common.util.PropertyUtil;
import jp.agentec.sinaburocast.entity.Member;
import jp.agentec.sinaburocast.entity.MemberWithdraw;
import jp.agentec.sinaburocast.form.user.WithDrawForm;

import org.apache.log4j.Logger;
import org.seasar.extension.jdbc.where.SimpleWhere;
import org.seasar.framework.container.annotation.tiger.Component;
import org.seasar.framework.container.annotation.tiger.InstanceType;
import org.seasar.framework.util.StringUtil;

@Component(instance=InstanceType.SINGLETON)
public class MemberWithdrawService extends AbstractService<MemberWithdraw> {
	public static final String ID_SEQ_NAME = "member_withdraw_id_seq";

	private final Logger logger = Logger.getLogger(getClass());


	public MemberService memberService;
	/**
	 * IDを発行して、登録する。
	 */
	public int insertMemberWithdraw(MemberWithdraw memberWithdraw, String insId) {
		memberWithdraw.memberWithdrawId = getSeqNextVal(Integer.class, ID_SEQ_NAME);
		return super.insert(memberWithdraw, insId);
	}

    public MemberWithdraw findById(Integer memberWithdrawId) {
        return select().id(memberWithdrawId).getSingleResult();
    }

    public MemberWithdraw findBymemberId(Integer memberId) {
        return select().where(new SimpleWhere().eq("memberId", memberId)).getSingleResult();
    }

    public List<MemberWithdraw> findAllOrderById() {
        return select().orderBy("memberWithdrawId asc").getResultList();
    }

    public List<MemberWithdraw> findBymemberIdList(Integer memberId) {
        return select().where(new SimpleWhere().eq("memberId", memberId)).getResultList();
    }
    /**
     * 退会処理を行う。
     * "退会情報"insert
     * "会員情報"update
     *
     * @return "退会情報"の更新件数。
     * @throws MessagingException 
     * @throws UnsupportedEncodingException 
     */
    public int insertMemberWithdrawLogic(Member member,WithDrawForm withDrawForm) throws UnsupportedEncodingException, MessagingException {
    	MemberWithdraw memberWithdraw = new MemberWithdraw();
    	memberWithdraw.memberId=member.memberId;
    	memberWithdraw.reasonType = 0;
    	memberWithdraw.reasonComment= withDrawForm.reasonMsg;

    	int reasonType = 0;
    	if(withDrawForm.withDrowReasonBoxes != null){
    			for (String arg : withDrawForm.withDrowReasonBoxes) {
	    		switch (Integer.parseInt(arg)) {
				case 0:
					  reasonType += 1;
					break;
				case 1:
					reasonType += 2;
					break;
				case 2:
					reasonType += 4;
				}
			}
    	}
    	memberWithdraw.reasonType = (short)reasonType;

    	insertMemberWithdraw(memberWithdraw,member.loginId);

    	//有効フラグ、削除フラグを無効にする。
    	member.validFlg=Integer.parseInt(SinaburoConstant.MemberValidFlg.INVALID);
    	member.delFlg=Integer.parseInt(SinaburoConstant.MemberDelFlg.DEL);

    	Properties prop = PropertyUtil.getProperties("application_ja",false);
    	try {
        	if(StringUtil.isNotBlank(member.pcEmail)){
        		MailUtil.send(member.pcEmail, prop.getProperty("withDrow.mail.title"),prop.getProperty("withDrow.mail.body"));
        	}
        	if(StringUtil.isNotBlank(member.mbEmail)){
        		MailUtil.send(member.mbEmail, prop.getProperty("withDrow.mail.title"),prop.getProperty("withDrow.mail.body"));
        	}
		} catch (MessagingException e) {
			logger.error("Mail send failed." + e.toString()); // 退会時なので例外はスローしない
		}
    	
    	member.pointNum=0;
		
    	return memberService.update(member,member.loginId);
    }

}