package com.aimluck.eip.cashflow;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.jar.Attributes;

import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;

import com.aimluck.commons.field.ALDateTimeField;
import com.aimluck.commons.field.ALStringField;
import com.aimluck.eip.common.ALAbstractSelectData;
import com.aimluck.eip.common.ALDBErrorException;
import com.aimluck.eip.common.ALData;
import com.aimluck.eip.common.ALPageNotFoundException;
import com.aimluck.eip.modules.actions.common.ALAction;
import com.aimluck.eip.services.accessctl.ALAccessControlConstants;
import com.aimluck.eip.util.ALEipUtils;
import com.aimluck.eip.cashflow.util.CashFlowUtils;

public class CashFlowSelectData extends ALAbstractSelectData implements ALData {

  /** <code>viewYear</code> 開始年度 */
  private ALDateTimeField viewYear;

  /** <code>prevYear</code> 開始年度の前の年 */
  private ALDateTimeField prevYear;

  /** <code>nextYear</code> 開始年度の次の年 */
  private ALDateTimeField nextYear;
  
  /** <code>currentYear</code> 今年度 */
  private ALDateTimeField currentYear;
  
  /** <code>viewMonth</code> 開始年月 */
  private ALDateTimeField viewMonth;

  /** <code>prevMonth</code> 開始年月の前の月 */
  private ALDateTimeField prevMonth;

  /** <code>nextMonth</code> 開始年月の次の月 */
  private ALDateTimeField nextMonth;
  
  /** <code>viewMonth</code> 終了年月 */
  private ALDateTimeField viewMonth2;

  /** <code>prevMonth</code> 終了年月の前の月 */
  private ALDateTimeField prevMonth2;

  /** <code>nextMonth</code> 終了年月の次の月 */
  private ALDateTimeField nextMonth2;
  
  /** <code>currentMonth</code> 今月 */
  private ALDateTimeField currentMonth;

  /** <code>currentMonth</code> 選択されている帳票 */
  private ALStringField tempNum;

  public void init(ALAction action, RunData rundata, Context context)
      throws ALPageNotFoundException, ALDBErrorException {
    
    // 開始年度
    viewYear = new ALDateTimeField("yyyy");    
    // 開始年度の前の年
    prevYear = new ALDateTimeField("yyyy");
    // 開始年度の次の年
    nextYear = new ALDateTimeField("yyyy");
    // 今年度
    currentYear = new ALDateTimeField("yyyy");
    
    // 開始年月
    viewMonth = new ALDateTimeField("yyyy-MM");    
    // 開始年月の前の月
    prevMonth = new ALDateTimeField("yyyy-MM");
    // 開始年月の次の月
    nextMonth = new ALDateTimeField("yyyy-MM");
    // 今月
    currentMonth = new ALDateTimeField("yyyy-MM");
 
    // 終了年月
    viewMonth2 = new ALDateTimeField("yyyy-MM");   
    // 終了年月の前の月
    prevMonth2 = new ALDateTimeField("yyyy-MM");
    // 終了年月の次の月
    nextMonth2 = new ALDateTimeField("yyyy-MM");
    // 選択されている帳票
    tempNum = new ALStringField();
    tempNum.setValue("");
    
    // 自ポートレットからのリクエストであれば、パラメータを展開しセッションに保存する。
    if (ALEipUtils.isMatch(rundata, context)) {
      // 開始年度
      if (rundata.getParameters().containsKey("view_year")) {
        ALEipUtils.setTemp(rundata, context, "view_year", rundata
            .getParameters().getString("view_year"));
      }
      
      // 開始年月
      if (rundata.getParameters().containsKey("view_month")) {
        ALEipUtils.setTemp(rundata, context, "view_month", rundata
            .getParameters().getString("view_month"));
      }
      
      // 終了年月
      if (rundata.getParameters().containsKey("view_month2")) {
        ALEipUtils.setTemp(rundata, context, "view_month2", rundata
            .getParameters().getString("view_month2"));
      }
      
      // 選択されている帳票
      if (rundata.getParameters().containsKey("temp_num")) {
        ALEipUtils.setTemp(rundata, context, "temp_num", rundata
            .getParameters().getString("temp_num"));
      }
    }

    // 選択されている帳票
    String tmpTempNum = ALEipUtils.getTemp(rundata, context, "temp_num");
    if (tmpTempNum == null || tmpTempNum.equals("")){
      tempNum.setValue("1");
    }else{
      tempNum.setValue(tmpTempNum);
      if (!tempNum.validate(new ArrayList())) {
        ALEipUtils.removeTemp(rundata, context, "temp_num");
        throw new ALPageNotFoundException();
      }
    }
    
    // 開始年度
    String tmpViewYear = ALEipUtils.getTemp(rundata, context, "view_year");
    if (tmpViewYear == null || tmpViewYear.equals("")) {
      Calendar cal = Calendar.getInstance();
      Calendar companyStart = CashFlowUtils.getCompanyStart(rundata,context);
      if(cal.get(Calendar.MONTH) < companyStart.get(Calendar.MONTH)){
        cal.add(Calendar.YEAR, -1);
      }
      cal.set(Calendar.DATE, 1);
      cal.set(Calendar.HOUR_OF_DAY, 0);
      cal.set(Calendar.MINUTE, 0);
      viewYear.setValue(cal.getTime());
    } else {
      viewYear.setValue(tmpViewYear);
      if (!viewYear.validate(new ArrayList())) {
        ALEipUtils.removeTemp(rundata, context, "view_year");
        throw new ALPageNotFoundException();
      }
    }
    
    // 開始年度の次の年、前の年
    Calendar cal2 = Calendar.getInstance();
    cal2.setTime(viewYear.getValue());
    cal2.add(Calendar.YEAR, 1);
    nextYear.setValue(cal2.getTime());
    cal2.add(Calendar.YEAR, -2);
    prevYear.setValue(cal2.getTime());

    // 開始年月
    String tmpViewMonth = ALEipUtils.getTemp(rundata, context, "view_month");
    if (tmpViewMonth == null || tmpViewMonth.equals("")) {
      Calendar cal3 = Calendar.getInstance();
      cal3.set(Calendar.DATE, 1);
      cal3.set(Calendar.HOUR_OF_DAY, 0);
      cal3.set(Calendar.MINUTE, 0);
      viewMonth.setValue(cal3.getTime());
    } else {
      viewMonth.setValue(tmpViewMonth);
      if (!viewMonth.validate(new ArrayList())) {
        ALEipUtils.removeTemp(rundata, context, "view_month");
        throw new ALPageNotFoundException();
      }
    }
    
    // 開始年月の次の月、前の月
    Calendar cal4 = Calendar.getInstance();
    cal4.setTime(viewMonth.getValue());
    cal4.add(Calendar.MONTH, 1);
    nextMonth.setValue(cal4.getTime());
    cal4.add(Calendar.MONTH, -2);
    prevMonth.setValue(cal4.getTime());
    
    // 終了年月
    String tmpViewMonth2 = ALEipUtils.getTemp(rundata, context, "view_month2");
    if (tmpViewMonth2 == null || tmpViewMonth2.equals("")) {
      Calendar cal5 = Calendar.getInstance();
      cal5.set(Calendar.DATE, 1);
      cal5.set(Calendar.HOUR_OF_DAY, 0);
      cal5.set(Calendar.MINUTE, 0);
      viewMonth2.setValue(cal5.getTime());
    } else {
      viewMonth2.setValue(tmpViewMonth2);
      if (!viewMonth2.validate(new ArrayList())) {
        ALEipUtils.removeTemp(rundata, context, "view_month2");
        throw new ALPageNotFoundException();
      }
    }
    
    // 終了年月の次の月、前の月
    Calendar cal6 = Calendar.getInstance();
    cal6.setTime(viewMonth2.getValue());
    cal6.add(Calendar.MONTH, 1);
    nextMonth2.setValue(cal6.getTime());
    cal6.add(Calendar.MONTH, -2);
    prevMonth2.setValue(cal6.getTime());

  }
  
  @Override
  protected Attributes getColumnMap() {
    // TODO 自動生成されたメソッド・スタブ
    return null;
  }

  @Override
  protected Object getResultData(Object obj) throws ALPageNotFoundException,
      ALDBErrorException {
    // TODO 自動生成されたメソッド・スタブ
    return null;
  }

  @Override
  protected Object getResultDataDetail(Object obj)
      throws ALPageNotFoundException, ALDBErrorException {
    // TODO 自動生成されたメソッド・スタブ
    return null;
  }

  @Override
  protected Object selectDetail(RunData rundata, Context context)
      throws ALPageNotFoundException, ALDBErrorException {
    // TODO 自動生成されたメソッド・スタブ
    return null;
  }

  @Override
  protected List selectList(RunData rundata, Context context)
      throws ALPageNotFoundException, ALDBErrorException {
    // TODO 自動生成されたメソッド・スタブ
    return null;
  }
  
  /**
   * 開始年度を取得します。
   * 
   * @return
   */
  public ALDateTimeField getViewYear() {
    return viewYear;
  }
  
  /**
   * 開始年度の前の年を取得します。
   * 
   * @return
   */
  public ALDateTimeField getPrevYear() {
    return prevYear;
  }

  /**
   * 開始年度の次の年を取得します。
   * 
   * @return
   */
  public ALDateTimeField getNextYear() {
    return nextYear;
  }

  /**
   * 今年度を取得します。
   * 
   * @return
   */
  public ALDateTimeField getCurrentYear() {
    return currentYear;
  }

  /**
   * 開始年月を取得します。
   * 
   * @return
   */
  public ALDateTimeField getViewMonth() {
    return viewMonth;
  }
  
  /**
   * 開始年月の前の月を取得します。
   * 
   * @return
   */
  public ALDateTimeField getPrevMonth() {
    return prevMonth;
  }

  /**
   * 開始年月の次の月を取得します。
   * 
   * @return
   */
  public ALDateTimeField getNextMonth() {
    return nextMonth;
  }

  /**
   * 今月を取得します。
   * 
   * @return
   */
  public ALDateTimeField getCurrentMonth() {
    return currentMonth;
  }

  /**
   * 終了年月を取得します。
   * 
   * @return
   */
  public ALDateTimeField getViewMonth2() {
    return viewMonth2;
  }
  
  /**
   * 終了年月の前の月を取得します。
   * 
   * @return
   */
  public ALDateTimeField getPrevMonth2() {
    return prevMonth2;
  }

  /**
   * 終了年月の次の月を取得します。
   * 
   * @return
   */
  public ALDateTimeField getNextMonth2() {
    return nextMonth2;
  }  

  /**
   * 選択された帳票を取得します。
   * 
   * @return
   */
  public ALStringField getTempNum() {
    return tempNum;
  }  

  /**
   * アクセス権限チェック用メソッド。<br />
   * アクセス権限の機能名を返します。
   *
   * @return
   */
  public String getAclPortletFeature() {
    return ALAccessControlConstants.POERTLET_CASHFLOW;
  }

}
