package jp.agentec.sinaburocast.service;

import java.io.UnsupportedEncodingException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

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.common.util.SinaburoUtil;
import jp.agentec.sinaburocast.entity.Member;
import jp.agentec.sinaburocast.entity.Message;
import jp.agentec.sinaburocast.entity.PasswordMailSend;

import org.apache.commons.lang.RandomStringUtils;
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;

@Component(instance=InstanceType.SINGLETON)
public class PasswordMailSendService extends AbstractService<PasswordMailSend> {

	private static final Logger logger = Logger.getLogger(PasswordMailSendService.class);
	public static final String ID_SEQ_NAME = "password_mail_send_id_seq";
	public static final String PASSWORD_MAIL_TITLE = "パスワード確認URLのご送付";


	public MessageService messageService;




	/**
	 * IDを発行して、登録する。
	 */
	public int insertPasswordMailSend(PasswordMailSend passwordMailSend, String insId) {
		passwordMailSend.passwordMailSendId = getSeqNextVal(Integer.class, ID_SEQ_NAME);
		return super.insert(passwordMailSend, insId);
	}


    public PasswordMailSend findById(Integer passwordMailSendId) {
        return select().id(passwordMailSendId).getSingleResult();
    }

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

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

    public List<PasswordMailSend> findBymemberIdList(Integer memberId) {
        return select().where(new SimpleWhere().eq("memberId", memberId)).getResultList();
    }

    /**
     * ID、パスワード問い合わせのメールを送信し、パスワード確認メール送信TBLにデータ登録
     *
     * @param member ユーザー情報
     * @param email  ユーザーが入力したEmailアドレス
     * @return insertの結果件数。
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     */
	public int insertPasswordMailSendLogic(Member member,String email)throws MessagingException, UnsupportedEncodingException {

    	//事前準備
    	Message message=messageService.findById(SinaburoConstant.MessageCode.PASS_WORD_CONFIRM);
    	List<PasswordMailSend> passwordMailSends = this.findAllByMailType(SinaburoConstant.MailType.PASSWORD);


    	int retValue = 0;

    	//データ設定
    	PasswordMailSend passwordMailSend = new  PasswordMailSend();
    	//onetimeTicketは唯一
    	ArrayList<String> onetimeTicketList = new ArrayList<String>();
    	for (PasswordMailSend pms : passwordMailSends) {
    		onetimeTicketList.add(pms.onetimeTicket);
		}

    	String min = PropertyUtil.getProperty("mail.add_expired_date_min");
    	passwordMailSend.memberId = member.memberId;
    	passwordMailSend.expiredDate = SinaburoUtil.addMin(Integer.parseInt(min));
    	passwordMailSend.mailType=SinaburoConstant.MailType.PASSWORD;

		do {
			passwordMailSend.onetimeTicket = RandomStringUtils.randomAlphanumeric(30);
			//既に登録されていたら作りなおす
		} while (onetimeTicketList.contains(passwordMailSend.onetimeTicket) );

		//登録
    	retValue = insertPasswordMailSend(passwordMailSend,member.loginId);

    	//メール送信
    	String body= MessageFormat.format(message.message.replace("\\r\\n", "\r\n"), passwordMailSend.onetimeTicket);
		MailUtil.send(email, PASSWORD_MAIL_TITLE,body.toString());

    	return retValue;
    }
	
	public List<PasswordMailSend> findAllByMailType(Integer mailType){
		return select().where(new SimpleWhere().eq("mailType", mailType)).getResultList();	
	}
	
	public PasswordMailSend findByTicketAndMailType(String oneTimeTicket,Integer mailType){
		return select().where(new SimpleWhere().eq("onetimeTicket", oneTimeTicket).ge("expiredDate", SinaburoUtil.getTimestamp())).getSingleResult();	
	}
	
	


	/**
	 * OneTypeTicketで検索する。oneTypeTicketが同一でexpiredDateが一時間前より以降
	 * @param passwordMailSendId
	 * @return
	 */
    public PasswordMailSend findByOneTypeTicket(String oneTypeTicket,Integer mailType) {
    	String min = PropertyUtil.getProperty("mail.add_expired_date_min");
        return select().where(new SimpleWhere().eq("onetimeTicket", oneTypeTicket).gt("expiredDate", SinaburoUtil.addMin(Integer.parseInt(min) * -1)).eq("mailType", mailType)).getSingleResult();
    }

}