package jp.co.y_net.amm.dao;

import java.io.Serializable;
import java.util.Comparator;

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


public class Grpusr extends AppDto implements Serializable {
    private static final long serialVersionUID = 1L;
    
    public static final Integer STATUS_未設定 = -1;
    public static final Integer STATUS_招待中 = 0;
    public static final Integer STATUS_参加中 = 1;
    public static final Integer STATUS_脱退 = 2;
    
    public static final Integer STATUS_ADMIN_未設定 = -1;
    public static final Integer STATUS_ADMIN_移管依頼中 = 0;
    public static final Integer STATUS_ADMIN_移管完了 = 1;
    
    
    /* DBMSと連携するメンバ */
    private Integer grpusrid;
    private Integer grpid;
    private Integer usrid;
    
    private Long invitationdate;
    private Long joindate;
    private Long leavedate;
    private Long admindate;
    
    private Integer statusadmin;
    private Integer status;


    
    /* アプリケーションで設定するメンバ */
    // なし
    
    /* 自動生成のアクセサ */
    public Integer getGrpusrid() {
        return grpusrid;
    }
    public void setGrpusrid(Integer grpusrid) {
        this.grpusrid = grpusrid;
    }
    public Integer getGrpid() {
        return grpid;
    }
    public void setGrpid(Integer grpid) {
        this.grpid = grpid;
    }
    public Integer getUsrid() {
        return usrid;
    }
    public void setUsrid(Integer usrid) {
        this.usrid = usrid;
    }
    public Long getInvitationdate() {
        return invitationdate;
    }
    public void setInvitationdate(Long invitationdate) {
        this.invitationdate = invitationdate;
    }
    public Long getJoindate() {
        return joindate;
    }
    public void setJoindate(Long joindate) {
        this.joindate = joindate;
    }
    public Long getLeavedate() {
        return leavedate;
    }
    public void setLeavedate(Long leavedate) {
        this.leavedate = leavedate;
    }
    public Long getAdmindate() {
        return admindate;
    }
    public void setAdmindate(Long admindate) {
        this.admindate = admindate;
    }
    public Integer getStatusadmin() {
        return statusadmin;
    }
    public void setStatusadmin(Integer statusadmin) {
        this.statusadmin = statusadmin;
    }
    public Integer getStatus() {
        return status;
    }
    public void setStatus(Integer status) {
        this.status = status;
    }
    /* 自動生成のアクセサ -end */

    /* 型変換のアクセサ */

    
    /* 型変換のアクセサ - end */

    
    /**
     * 参加日時のソートに用いるComparator
     */
    public static class JoindateComparator implements Comparator<Grpusr> {
        /** trueに変更すると新しい順 */
        private boolean desc = false; 
        
        public JoindateComparator(boolean desc) {
            this.desc = desc;
        }
        
        @Override
        public int compare(Grpusr o1, Grpusr o2) {
            int reverse = 1;
            if(desc) {
                reverse = -1;
            }
            
            Long n1 = 0L;
            Long n2 = 0L;
            if(o1 != null && o1.getJoindate() != null) n1 = o1.getJoindate();
            if(o2 != null && o2.getJoindate() != null) n2 = o2.getJoindate();
            
            /* 参加日が未設定の時は、招待日に置き換える */
            if(n1 == 0L) {
                if(o1 != null && o1.getInvitationdate() != null) n1 = o1.getInvitationdate();
            }
            if(n2 == 0L) {
                if(o2 != null && o2.getInvitationdate() != null) n2 = o2.getInvitationdate();
            }
            
            return Long.compare(n1, n2) * reverse;
        }
    }

    /**
     * statusadmin と status を合算した結果を表示文字列で返す。
     * 
     * 参加状態(status)=「招待中」 ⇒ 招待中
     * 参加状態(status)=「参加済み」 かつ 移管状態=未設定 ⇒ 参加中
     * 参加状態(status)=「参加済み」 かつ 移管状態=「移管依頼中」 ⇒ 移管依頼中
     * 参加状態(status)=「参加済み」 かつ 移管状態=「移管完了」 ⇒ 参加中
     */
    public String getStatus合算() {
        if(this.status == null || STATUS_未設定.equals(this.status) ) {
            return "";
        }
        if(STATUS_招待中.equals(this.status)) {
            return "招待中";
        }
        if(STATUS_参加中.equals(this.status)) {
            
            if(STATUS_ADMIN_移管依頼中.equals(this.status)) {
                return "移管依頼中";
            }
            return "参加中";
        }
        return "";
    }
    public void set脱退設定() {
        this.setLeavedate(AppUtils.createNowLong()); // 脱退日時
        this.setStatus(Grpusr.STATUS_脱退);
    }


}

