package jp.co.y_net.amm.common;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.model.Model;

/**
 * 日付選択用ドロップダウンリストの要素、ユーティリティ
 * @author k.inaba
 */
public class ChoiceDateElement implements Serializable {
	private static final long serialVersionUID = 1L;

	private String id;
	private String name;

	public ChoiceDateElement(String id, String name) {
		this.id = id;
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
   
    
    /**
     * 日付選択用ドロップダウンリスト
     */
    public static class DropDownChoiceDate extends DropDownChoice<ChoiceDateElement> {
        public DropDownChoiceDate(String id, Model<ChoiceDateElement> model, List<ChoiceDateElement> choice) {
            super(id, model, choice, new MyRenderer());
        }
    }
    /**
     * 日付選択用ドロップダウンリストに使用するレンダラ
     */
    private static class MyRenderer extends ChoiceRenderer<ChoiceDateElement>{
        public MyRenderer() {
            super("name","id");
        }
    }

    public static String 日付取得(Model<ChoiceDateElement> y, Model<ChoiceDateElement> m, Model<ChoiceDateElement> d) {
        return y.getObject().getId() + m.getObject().getId() + d.getObject().getId();
    }
    
    
    /**
     * 年の選択肢を作成する。
     * 原則として、現在の年を含む未来６年分の選択肢を作成するが、
     * 引数の fromdateValue、todateValue が含まれない場合は追加する。
     * @param fromdateValue 
     * @param todateValue 
     * @return
     */
    public static List<ChoiceDateElement> createChoiceY(String fromdateValue, String todateValue) {

        List<ChoiceDateElement> choice = new ArrayList<ChoiceDateElement>();
        choice.add(new ChoiceDateElement("0000", "未指定"));

        Integer iNowYYYY = Calendar.getInstance().get(Calendar.YEAR);
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 6; i++) { // 現在から6年先までの選択肢を作成
            Integer yyyy = iNowYYYY + i;
            list.add(yyyy);
        }

        /* すでに登録されている値 */
        Integer iFromYYYY = Integer.parseInt(getYYYY(fromdateValue));
        Integer iToYYYY = Integer.parseInt(getYYYY(todateValue));
        if (iFromYYYY != 0 && list.contains(iFromYYYY) == false) {
            list.add(iFromYYYY);
        }
        if (iToYYYY != 0 && list.contains(iToYYYY) == false) {
            list.add(iToYYYY);
        }
        Collections.sort(list);

        for (Integer yyyy : list) {
            choice.add(new ChoiceDateElement(String.valueOf(yyyy), yyyy + "年"));
        }

        return choice;
    }
    /**
     * 月の選択肢を作成する
     * @return
     */
    public static List<ChoiceDateElement> createChoiceM() {
        List<ChoiceDateElement> choice = new ArrayList<ChoiceDateElement>();
        choice.add(new ChoiceDateElement("00", "--"));
        for (int i = 1; i <= 12; i++) {
            String str = StringUtils.leftPad(String.valueOf(i), 2, '0');
            choice.add(new ChoiceDateElement(str, i + "月"));
        }
        return choice;
    }
    /**
     * 日の選択肢を作成する
     * @return
     */
    public static List<ChoiceDateElement> createChoiceD() {
        List<ChoiceDateElement> choice = new ArrayList<ChoiceDateElement>();
        choice.add(new ChoiceDateElement("00", "--"));
        for (int i = 1; i <= 31; i++) {
            String str = StringUtils.leftPad(String.valueOf(i), 2, '0');
            choice.add(new ChoiceDateElement(str, i + "日"));
        }
        return choice;
    }
    
    /**
     * 年のモデルを作成する
     * 引数 choiceY のうち、targetDate と一致するものを初期値とする。
     * targetDateは yyyyMMdd で記述されているものとし、このメソッドでは、yyyy部分を参照する。
     * @param choiceY 
     * @param targetDate 
     * @return
     */
    public static Model<ChoiceDateElement> createModelY(List<ChoiceDateElement> choiceY, String targetDate) {
        Model<ChoiceDateElement> model = new Model<ChoiceDateElement>();
        select(choiceY, getYYYY(targetDate), model);
        return model;
    }
    /**
     * 月のモデルを作成する
     * 引数 choiceY のうち、targetDate と一致するものを初期値とする。
     * targetDateは yyyyMMdd で記述されているものとし、このメソッドでは、MM部分を参照する。
     * @param choiceY 
     * @param targetDate 
     * @return
     */
    public static Model<ChoiceDateElement> createModelM(List<ChoiceDateElement> choice, String targetDate) {
        Model<ChoiceDateElement> model = new Model<ChoiceDateElement>();
        select(choice, getMM(targetDate), model);
        return model;
    }
    /**
     * 月のモデルを作成する
     * 引数 choiceY のうち、targetDate と一致するものを初期値とする。
     * targetDateは yyyyMMdd で記述されているものとし、このメソッドでは、dd部分を参照する。
     * @param choiceY 
     * @param targetDate 
     * @return
     */
    public static Model<ChoiceDateElement> createModelD(List<ChoiceDateElement> choice, String targetDate) {
        Model<ChoiceDateElement> model = new Model<ChoiceDateElement>();
        select(choice, getDD(targetDate), model);
        return model;
    }
    
    
    private static void select(List<ChoiceDateElement> choice, String target, Model<ChoiceDateElement> model) {
        for (ChoiceDateElement c : choice) {
            if (c.getId().equals(target)==true) {
                model.setObject(c);
            }
        }
    }
    
    
    
    
    private static String getYYYY(String yyyyMMdd) {
        String str;
        if(yyyyMMdd == null || yyyyMMdd.length() != 8) {
            str = "0000";
        } else {
            str = yyyyMMdd.substring(0, 4);
        }
        return str;
    }
    private static String getMM(String yyyyMMdd) {
        String str;
        if(yyyyMMdd == null || yyyyMMdd.length() != 8) {
            str = "00";
        } else {
            str = yyyyMMdd.substring(4, 6);
        }
        return str;
    }
    private static String getDD(String yyyyMMdd) {
        String str;
        if(yyyyMMdd == null || yyyyMMdd.length() != 8) {
            str = "00";
        } else {
            str = yyyyMMdd.substring(6, 8);
        }
        return str;
    }
}

