/*
 * Aipo is a groupware program developed by Aimluck,Inc.
 * Copyright (C) 2004-2008 Aimluck,Inc.
 * http://aipostyle.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package com.aimluck.eip.mclient.util;

import java.util.ArrayList;
import java.util.List;
import org.apache.cayenne.DataRow;
import org.apache.cayenne.access.DataContext;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.query.SQLTemplate;
import org.apache.cayenne.query.SelectQuery;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;
import com.aimluck.eip.cayenne.om.portlet.ImwMClient;
import com.aimluck.eip.cayenne.om.portlet.ImwMHanyo;
import com.aimluck.eip.cayenne.om.security.TurbineUser;
import com.aimluck.eip.common.ALEipConstants;
import com.aimluck.eip.mclient.MClientResultData;
import com.aimluck.eip.orm.DatabaseOrmService;
import com.aimluck.eip.util.ALEipUtils;

public class MClientUtils {

  /** logger */
  private static final JetspeedLogger logger = JetspeedLogFactoryService
      .getLogger(MClientUtils.class.getName());

  /**
   * (IMTT) 殿 
   * サブシステム名 セッションに格納されているIDを用いて、顧客情報を取得します。 
   * 機能名(顧客)
   *  作成:アイエムシンクタンク株式会社
   * 初版:年月日 by IMTT 
   * 改版:2010年08月14日 by キョク
   */
  public static ImwMClient getImwMClient(RunData rundata, Context context) {
    ImwMClient result = null;
    String id = ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
    try {
      if (id == null || Integer.valueOf(id) == null) {
        logger.debug("Empty ID...");
        return result;
      }

      DataContext dataContext = DatabaseOrmService.getInstance()
          .getDataContext();
      Expression exp = ExpressionFactory.matchDbExp(
          ImwMClient.CLIENT_ID_PK_COLUMN, Integer.valueOf(id));
      SelectQuery query = new SelectQuery(ImwMClient.class, exp);
      List list = dataContext.performQuery(query);
      if (list == null || list.size() == 0) {
        logger.debug("Not found ID...");
        return result;
      }
      result = (ImwMClient) list.get(0);
    } catch (Exception ex) {
      logger.error("Exception", ex);
    }
    return result;
  }

  /**
   * (IMTT) 殿 
   * サブシステム名 ユーザIDを用いて、ユーザ名を取得します。
   *  機能名(顧客) 
   *  作成:アイエムシンクタンク株式会社 
   *  初版:年月日 by IMTT 
   *  改版:2010年08月14日 by キョク
   */
  public static String getTLoginName(Integer userId) {
    TurbineUser result = null;
    DataContext dataContext = DatabaseOrmService.getInstance().getDataContext();
    Expression exp = ExpressionFactory.matchDbExp(
        TurbineUser.USER_ID_PK_COLUMN, userId);
    SelectQuery query = new SelectQuery(TurbineUser.class, exp);
    List list = dataContext.performQuery(query);
    if (list == null || list.size() == 0) {
      return "";
    }
    result = (TurbineUser) list.get(0);
    //update 20100818 seki start---
//    return result.getFirstName() + result.getLastName();
    return result.getLastName() + " " + result.getFirstName() ;
    //update 20100818 seki end---
  }

  /**
   * (IMTT) 殿 
   * サブシステム名 
   * 担当ユーザIDを用いて、担当ユーザ名を取得します。 
   * 機能名(顧客) 
   * 作成:アイエムシンクタンク株式会社 
   * 初版:年月日 by IMTT 
   * 改版:2010年08月14日 by キョク
   */
  public static String getMDemandClientName(Integer clientId) {
    ImwMClient result = null;
    DataContext dataContext = DatabaseOrmService.getInstance().getDataContext();
    Expression exp = ExpressionFactory.matchDbExp(
        ImwMClient.CLIENT_ID_PK_COLUMN, clientId);
    SelectQuery query = new SelectQuery(ImwMClient.class, exp);
    List list = dataContext.performQuery(query);
    if (list == null || list.size() == 0) {
      return "";
    }
    result = (ImwMClient) list.get(0);

    return result.getClientName();

  }

  /**
   * (IMTT) 殿 
   * サブシステム名 
   * 汎用マスタの汎用名を支払区分にセットする。
   *  機能名(顧客) 
   *  作成:アイエムシンクタンク株式会社 
   *  初版:年月日 by IMTT 
   *  改版:2010年08月14日 by キョク
   */

  public static String getPayClass(int id, int parentHanyoId) {

    String query = "select h.hanyokubunnm from imw_m_hanyo h , imw_m_client c where h.parent_hanyo_id = "
        + parentHanyoId + " and h.value = c.pay_class and c.client_id = " + id;
    String hanyokubunnm = "";
    try {
      DataContext dataContext = DatabaseOrmService.getInstance()
          .getDataContext();
      SQLTemplate rawSelect = new SQLTemplate(ImwMHanyo.class, query, true);
      rawSelect.setFetchingDataRows(true);
      List list = dataContext.performQuery(rawSelect);

      DataRow dataRow;

      dataRow = (DataRow) list.get(0);

      hanyokubunnm = (String) ALEipUtils.getObjFromDataRow(dataRow,
          ImwMHanyo.HANYOKUBUNNM_COLUMN);

    } catch (Exception ex) {
      logger.error("Exception", ex);
      return null;
    }

    return hanyokubunnm;

  }

  /**
   *(IMTT) 殿
   * サブシステム名 
   * 汎用マスタの汎用名を入金区分にセットする。
   *機能名(顧客)
   *作成:アイエムシンクタンク株式会社
   *初版:年月日 by IMTT 
   *改版:2010年08月14日 by キョク
   */
  public static String getReceiptClass(int id, int parentHanyoId) {

    String query = "select h.hanyokubunnm from imw_m_hanyo h , imw_m_client c "
        + "where h.parent_hanyo_id = " + parentHanyoId
        + " and h.value = c.receipt_class and c.client_id = " + id;
    String hanyokubunnm = "";
    try {
      DataContext dataContext = DatabaseOrmService.getInstance()
          .getDataContext();

      SQLTemplate rawSelect = new SQLTemplate(ImwMHanyo.class, query, true);
      rawSelect.setFetchingDataRows(true);
      List list = dataContext.performQuery(rawSelect);

      DataRow dataRow;

      dataRow = (DataRow) list.get(0);

      hanyokubunnm = (String) ALEipUtils.getObjFromDataRow(dataRow,
          ImwMHanyo.HANYOKUBUNNM_COLUMN);

    } catch (Exception ex) {
      logger.error("Exception", ex);
      return null;
    }

    return hanyokubunnm;

  }

  /**
   *(IMTT) 殿 
   *サブシステム名 
   *該当顧客にユーザがいるかどうかをチェックする。
   * 機能名(顧客)
   *作成:アイエムシンクタンク株式会社 
   *初版:年月日by IMTT 
   *改版:2010年08月14日 by キョク
   */
  public static List getDemandClientNameList(Integer clientId) {
    List resultList = new ArrayList();
    // SQLの作成
    StringBuffer statement = new StringBuffer();
    statement.append("SELECT CLIENT_ID,CLIENT_NAME,DEMAND_CLIENT_ID ");
    statement.append("FROM IMW_M_CLIENT ");
    /* Chg　2011/01/17 王志禹 Start--- */
    //statement.append("WHERE CLIENT_ID <>  '").append(clientId).append("' ");
    statement.append("WHERE 0 = 0 ");
    /* Chg　2011/01/17 王志禹 End--- */
    statement.append("  AND DISABLED <> 'T'");
    statement.append("  AND DISABLED <> 'N'");
    String query = statement.toString();

    DataContext dataContext = DatabaseOrmService.getInstance().getDataContext();
    SQLTemplate rawSelect = new SQLTemplate(ImwMClient.class, query, true);
    rawSelect.setFetchingDataRows(true);
    List list = dataContext.performQuery(rawSelect);
    int recNum = list.size();
    DataRow dataRow;
    MClientResultData record;

    for (int i = 0; i < recNum; i++) {
      dataRow = (DataRow) list.get(i);
      record = new MClientResultData();
      record.initField();
      record.setDemandClientId(((Integer) ALEipUtils.getObjFromDataRow(dataRow,
          "DEMAND_CLIENT_ID")).intValue());
      record.setClientId(((Integer) ALEipUtils.getObjFromDataRow(dataRow,
          "CLIENT_ID")).intValue());
      record.setClientName(((String) ALEipUtils.getObjFromDataRow(dataRow,
          "CLIENT_NAME")));

      resultList.add(record);
    }

    if (resultList == null || resultList.size() < 0) {
      return null;
    }
    return resultList;
  }

  /**
   * (IMTT) 殿 
   * サブシステム名 
   * ユーザテーブルの名（カナ）と姓（カナ）を取得します。 
   * 機能名(顧客) 
   * 作成:アイエムシンクタンク株式会社
   * 初版:年月日 by IMTT 
   * 改版:2010年08月14日 by キョク
   */
  public static List getUserNameList() {
    //update 20100818 seki start---
//    String query = "select user_id ,first_name ,last_name from turbine_user  where disabled='F'";
    /** Update 20110907 小濵 Start --- */
//  String query = "select user_id ,first_name ,last_name from turbine_user  where disabled='F' and user_id>3";
    String query = "select turbine_user.user_id " +
    		",first_name " +
    		",last_name " +
    		"from turbine_user " +
    		",eip_m_user_position " +
    		"where turbine_user.user_id = eip_m_user_position.user_id " +
    		"and disabled='F' " +
    		"and turbine_user.user_id>3 " +
    		"order by eip_m_user_position.position";
    /** Update 20110907 小濵 End   --- */
    //update 20100818 seki end---
    List userlist = new ArrayList();
    try {
      DataContext dataContext = DatabaseOrmService.getInstance()
          .getDataContext();
      SQLTemplate rawSelect = new SQLTemplate(TurbineUser.class, query, true);
      rawSelect.setFetchingDataRows(true);
      List list = dataContext.performQuery(rawSelect);

      int recordNum = list.size();
      DataRow dataRow;

      for (int i = 0; i < recordNum; i++) {
        dataRow = (DataRow) list.get(i);
        TurbineUser user = new TurbineUser();
        //update 20100818 seki start---
//        user.setUserId((Integer) ALEipUtils.getObjFromDataRow(dataRow,
//            TurbineUser.USER_ID_PK_COLUMN));
        user.setUserId(String.valueOf( ALEipUtils.getObjFromDataRow(dataRow,
            TurbineUser.USER_ID_PK_COLUMN)));        
        //update 20100818 seki end---
        user.setFirstName((String) ALEipUtils.getObjFromDataRow(dataRow,
            TurbineUser.FIRST_NAME_COLUMN));
        user.setLastName((String) ALEipUtils.getObjFromDataRow(dataRow,
            TurbineUser.LAST_NAME_COLUMN));

        userlist.add(user);

        if (userlist == null || userlist.size() < 0) {
          return null;
        }

      }
    } catch (Exception ex) {
      logger.error("Exception", ex);
      return null;
    }
    return userlist;
  }

}