/*
 * Aipo is a groupware program developed by Aimluck,Inc.
 * Copyright (C) 2004-2015 Aimluck,Inc.
 * http://www.aipo.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.aimluck.eip.project;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.aimluck.commons.field.ALDateTimeField;
import com.aimluck.commons.field.ALNumberField;
import com.aimluck.commons.field.ALStringField;
import com.aimluck.eip.common.ALData;
import com.aimluck.eip.common.ALEipUser;
import com.aimluck.eip.fileupload.beans.FileuploadBean;
import com.aimluck.eip.util.ALCommonUtils;
import com.aimluck.eip.util.ALEipUtils;

/**
 * プロジェクトのResultDataです。 <BR>
 *
 */
public class ProjectResultData implements ALData {

  /** プロジェクト ID */
  protected ALNumberField project_id;

  /** プロジェクト名 */
  protected ALStringField project_name;

  /** 説明 */
  protected ALStringField explanation;

  /** 管理者 ID */
  protected ALNumberField admin_user_id;

  /** 管理者名 */
  private ALStringField admin_user_name;

  /** 進捗率入力フラグ */
  protected ALStringField progress_flg;

  /** 進捗率 */
  protected ALNumberField progress_rate;

  /** 予定進捗率 */
  protected ALNumberField plan_progress_rate;

  /** 社内参加者 */
  private List<ALEipUser> memberList = null;

  /** 添付ファイルリスト */
  private List<FileuploadBean> attachmentFileList = null;

  /** 作成者ID */
  private ALNumberField create_user_id;

  /** 作成者 */
  protected ALStringField create_user_name;

  /** 更新者ID */
  private ALNumberField update_user_id;

  /** 更新者 */
  protected ALStringField update_user_name;

  /** ログインユーザーID */
  private ALNumberField login_user_id;

  /** 作成日 */
  protected ALDateTimeField create_date;

  /** 更新日 */
  protected ALDateTimeField update_date;

  /** タスク更新日 */
  protected ALDateTimeField task_update_date;

  /** 計画工数 */
  protected BigDecimal plan_workload;

  /** 工数実績 */
  protected BigDecimal workload;

  /** 完了予測工数 */
  protected BigDecimal forecast_workload;

  /** 残タスク数 **/
  protected int remainder_task;

  /** 小数値項目フォーマット */
  private final DecimalFormat df = new DecimalFormat("#.##");

  /**
   * 初期設定を行います
   */
  @Override
  public void initField() {
    project_id = new ALNumberField();
    project_name = new ALStringField();
    explanation = new ALStringField();
    admin_user_id = new ALNumberField();
    admin_user_name = new ALStringField();
    progress_flg = new ALStringField();
    progress_rate = new ALNumberField();
    plan_progress_rate = new ALNumberField();
    memberList = new ArrayList<ALEipUser>();
    create_user_id = new ALNumberField();
    create_user_name = new ALStringField();
    update_user_id = new ALNumberField();
    update_user_name = new ALStringField();
    login_user_id = new ALNumberField();
    create_date = new ALDateTimeField("M月d日");
    update_date = new ALDateTimeField("M月d日");
    task_update_date = new ALDateTimeField();
    plan_workload = new BigDecimal(0);
    workload = new BigDecimal(0);
    remainder_task = 0;
    forecast_workload = new BigDecimal(0);
  }

  /**
   * プロジェクトIDを取得する
   *
   * @return プロジェクトID
   */
  public ALNumberField getProjectId() {
    return project_id;
  }

  /**
   * プロジェクトIDを設定する
   *
   * @param i
   *          プロジェクトID
   */
  public void setProjectId(long i) {
    project_id.setValue(i);
  }

  /**
   * プロジェクト名を取得する
   *
   * @return プロジェクト名
   */
  public ALStringField getProjectName() {
    return project_name;
  }

  public String getProjectNameHtml() {
    return ALCommonUtils.replaceToAutoCR(project_name.toString());
  }

  /**
   * プロジェクト名を設定する
   *
   * @param string
   *          汎用データベース名
   */
  public void setProjectName(String string) {
    project_name.setValue(string);
  }

  /**
   * 説明を取得する
   *
   * @return 説明
   */
  public String getExplanation() {
    return ALEipUtils.getMessageList(explanation.getValue());
  }

  /**
   * 説明を設定する
   *
   * @param string
   *          説明
   */
  public void setExplanation(String string) {
    explanation.setValue(string);
  }

  /**
   * 管理者IDを取得する
   *
   * @return 管理者ID
   */
  public ALNumberField getAdminUserId() {
    return admin_user_id;
  }

  /**
   * 管理者IDを設定する
   *
   * @param i
   *          管理者ID
   */
  public void setAdminUserId(long i) {
    admin_user_id.setValue(i);
  }

  /**
   * 進捗率入力フラグを取得する
   *
   * @return 進捗率入力フラグ
   */
  public ALStringField getProgressFlg() {
    return progress_flg;
  }

  /**
   * 進捗率入力フラグを設定する
   *
   * @param string
   *          進捗率入力フラグ
   */
  public void setProgressFlg(String string) {
    progress_flg.setValue(string);
  }

  /**
   * 進捗率を取得する
   *
   * @return 進捗率
   */
  public ALNumberField getProgressRate() {
    return progress_rate;
  }

  /**
   * 進捗率を設定する
   *
   * @param i
   *          進捗率
   */
  public void setProgressRate(long i) {
    progress_rate.setValue(i);
  }

  /**
   * 予定進捗率を取得する
   *
   * @return 予定進捗率
   */
  public ALNumberField getPlanProgressRate() {
    return plan_progress_rate;
  }

  /**
   * 予定進捗率を設定する
   *
   * @param i
   *          予定進捗率
   */
  public void setPlanProgressRate(long i) {
    plan_progress_rate.setValue(i);
  }

  /**
   * 作成者IDを取得する
   *
   * @return create_user_id
   */
  public ALNumberField getCreateUserId() {
    return create_user_id;
  }

  /**
   * 作成者IDを設定する
   *
   * @param create_user_id
   */
  public void setCreateUserId(long i) {
    create_user_id.setValue(i);
  }

  /**
   * @return create_user_name
   */
  public ALStringField getCreateUserName() {
    return create_user_name;
  }

  /**
   * @param create_user_name
   *          セットする create_user_name
   */
  public void setCreateUserName(String string) {
    create_user_name.setValue(string);
  }

  /**
   * 更新者IDを取得する
   *
   * @return update_user_id
   */
  public ALNumberField getUpdateUserId() {
    return update_user_id;
  }

  /**
   * 更新者IDを設定する
   *
   * @param update_user_id
   */
  public void setUpdateUserId(long i) {
    update_user_id.setValue(i);
  }

  /**
   * @return update_user_name
   */
  public ALStringField getUpdateUserName() {
    return update_user_name;
  }

  /**
   * @param update_user_name
   *          セットする update_user_name
   */
  public void setUpdateUserName(String string) {
    update_user_name.setValue(string);
  }

  /**
   * ログインユーザーIDを取得する
   *
   * @return ログインユーザーID
   */
  public ALNumberField getLoginUserId() {
    return login_user_id;
  }

  /**
   * ログインユーザーIDを設定する
   *
   * @param ログインユーザーID
   */
  public void setLoginUserId(long i) {
    login_user_id.setValue(i);
  }

  /**
   * 作成日を取得する
   *
   * @return 作成日
   */
  public ALDateTimeField getCreateDate() {
    return create_date;
  }

  /**
   * 作成日を設定する
   *
   * @param dt
   *          作成日
   */
  public void setCreateDate(Date dt) {
    create_date.setValue(dt);
  }

  /**
   * 更新日を取得する
   *
   * @return 更新日
   */
  public ALDateTimeField getUpdateDate() {
    return update_date;
  }

  /**
   * 更新日を設定する
   *
   * @param dt
   *          更新日
   */
  public void setUpdateDate(Date dt) {
    update_date.setValue(dt);
  }

  /**
   * タスク更新日を取得する
   *
   * @return 更新日
   */
  public ALDateTimeField getTaskUpdateDate() {
    return ALEipUtils.getFormattedTime(task_update_date);
  }

  /**
   * タスク更新日を設定する
   *
   * @param dt
   *          更新日
   */
  public void setTaskUpdateDate(Date dt) {
    task_update_date.setValue(dt);
  }

  /**
   * 社内参加者を取得します。
   *
   * @return 社内参加者
   */
  public List<ALEipUser> getMemberList() {
    return memberList;
  }

  /**
   * 社内参加者を設定します。
   *
   * @param memberList
   *          社内参加者
   */
  public void setMemberList(List<ALEipUser> memberList) {
    this.memberList = memberList;
  }

  /**
   * アップロードファイルリストを取得します。
   *
   * @return アップロードファイルリスト
   */
  public List<FileuploadBean> getAttachmentFileList() {
    return attachmentFileList;
  }

  /**
   * アップロードファイルリストを設定します。
   *
   * @param attachmentFileList
   *          アップロードファイルリスト
   */
  public void setAttachmentFileList(List<FileuploadBean> attachmentFileList) {
    this.attachmentFileList = attachmentFileList;
  }

  /**
   * 管理者名を取得します。
   *
   * @return 管理者名
   */
  public ALStringField getAdminUserName() {
    return admin_user_name;
  }

  /**
   * 管理者名を設定します。
   *
   * @param string
   *          管理者名
   */
  public void setAdminUserName(String string) {
    admin_user_name.setValue(string);
  }

  /**
   * 計画工数を取得する
   *
   * @return 計画工数
   */
  public BigDecimal getPlanWorkload() {
    return plan_workload;
  }

  /**
   * 計画工数を設定する
   *
   * @param i
   *          計画工数
   */
  public void setPlanWorkload(BigDecimal i) {
    plan_workload = i;
  }

  /**
   * 計画工数を取得する（表示用）
   *
   * @return 計画工数
   */
  public String getPlanWorkloadFormat() {
    return df.format(plan_workload);
  }

  /**
   * 実績工数を取得する
   *
   * @return 実績工数
   */
  public BigDecimal getWorkload() {
    return workload;
  }

  /**
   * 実績工数を設定する
   *
   * @param i
   *          実績工数
   */
  public void setWorkload(BigDecimal i) {
    workload = i;
  }

  /**
   * 実績工数を取得する（表示用）
   *
   * @return 実績工数
   */
  public String getWorkloadFormat() {
    return df.format(workload);
  }

  /**
   * 完了予測工数を取得する
   *
   * @return 完了予測工数
   */
  public BigDecimal getForecastWorkload() {
    return forecast_workload;
  }

  /**
   * 完了予測工数を設定する
   *
   * @param i
   *          完了予測工数
   */
  public void setForecastWorkload(BigDecimal i) {
    forecast_workload = i;
  }

  /**
   * 完了予測工数を取得する（表示用）
   *
   * @return 完了予測工数
   */
  public String getForecastWorkloadFormat() {
    return df.format(forecast_workload);
  }

  /**
   * 残タスク数を設定する
   *
   * @param i
   *          残タスク数
   */
  public void setReminderTask(int i) {
    remainder_task = i;
  }

  /**
   * 残タスク数を取得する（表示用）
   *
   * @return 残タスク数
   */
  public int getReminderTask() {
    return remainder_task;
  }

  /**
   * 進捗遅延であるかをチェックする
   *
   * @return TRUE:工数オーバー
   */
  public boolean isDelay() {
    if ("".equals(getPlanProgressRate().toString())
      || "".equals(getProgressRate().toString())) {
      return false;
    }
    return (getPlanProgressRate().getValue() > getProgressRate().getValue());
  }

  /**
   * 工数オーバーであるかをチェックする
   *
   * @return TRUE:工数オーバー
   */
  public boolean isWorkloadOver() {
    return (getPlanWorkload().compareTo(getForecastWorkload()) < 0);
  }

}
