/**
 * @(#)file    UserManager.java
 * @(#)author  DaeJin Lee
 * @(#)version 1.0
 * @(#)date    2003-05-29
 * @(#)since   JDK1.3.1
 *
 * Copyright (c) 2002-2003 www.hwenc.com, Inc.  
 * All rights reserved.
 * This software is the proprietary information of hwenc, Inc.
 */
package kr.co.udapsoft.ebid.buyer.sycs.user.biz;

import java.sql.Connection;
import java.util.StringTokenizer;

import kr.co.hsnc.common.base.WAFLogger;
import kr.co.hsnc.common.config.WAFConfig;
import kr.co.hsnc.common.sql.RowSet;
import kr.co.hsnc.common.sql.RowSetImpl;
import kr.co.hsnc.common.sql.persistent.Persistent;
import kr.co.hsnc.common.sql.persistent.PersistentImpl;
import kr.co.hsnc.common.sql.search.Search;
import kr.co.hsnc.common.sql.search.SearchImpl;
import kr.co.hsnc.common.sql.util.RowSetUtility;
import kr.co.hsnc.common.util.ValueObject;
import com.udapsoft.waf.common.ui.HTMLMaker;

/**
* 분류코드/품목코드 DB 접근 Beans.
*
* @version 1.0 2003-05-29
* @author DaeJin Lee
*/
public class UserManager {

    private ValueObject user = null;
    private String ACCT_CAT_CODE = null;
    private String ACCT_TYPE_CODE = null;

    /**
	 * @param acctTypeCode
	 * @param inputName
	 * @param rightGB
	 * @param sytleStr
	 * @return
	 */
	public static String getSelectUserListByRightGB(String acctTypeCode, String inputName, String rightGB, String sytleStr) {

        return getSelectUserList(acctTypeCode, inputName, rightGB, sytleStr, null, null);
    }

    /**
	 * @param acctTypeCode
	 * @param inputName
	 * @param rightGB
	 * @param sytleStr
	 * @param defaultOption
	 * @return
	 */
	public static String getSelectUserListByRightGB(String acctTypeCode, String inputName, String rightGB, String sytleStr, String defaultOption) {

        return getSelectUserList(acctTypeCode, inputName, rightGB, sytleStr, defaultOption, null);
    }

    /**
	 * @param acctTypeCode
	 * @param inputName
	 * @param rightGB
	 * @param sytleStr
	 * @param defaultOption
	 * @param selectedValue
	 * @return
	 */
	public static String getSelectUserListByRightGB(String acctTypeCode, String inputName, String rightGB, String sytleStr, String defaultOption, String selectedValue) {

        RowSet userRowSet = UserManager.getUserList(acctTypeCode, rightGB);

        return HTMLMaker.getSelectTag(userRowSet, "ACCT_ID", "USER_NAME_P", inputName, sytleStr, defaultOption, selectedValue);
    }

    /**
     * 사용자 목록을 리턴한다.
	 * @param acctTypeCode
	 * @param inputName
	 * @param sytleAndAttrs
	 * @return
	 */
	public static String getSelectUserList(String acctTypeCode, String inputName, String rightGB, String sytleStr) {

        return getSelectUserList(acctTypeCode, inputName, rightGB, sytleStr, null, null);
    }

    /**
     * 사용자 목록을 리턴한다.
	 * @param acctTypeCode
	 * @param inputName
	 * @param sytleAndAttrs
	 * @param defaultOption
	 * @return
	 */
	public static String getSelectUserList(String acctTypeCode, String inputName, String rightGB, String sytleStr, String defaultOption) {

        return getSelectUserList(acctTypeCode, inputName, rightGB, sytleStr, defaultOption, null);
    }

    /**
     * 사용자 목록을 리턴한다.
	 * @param acctTypeCode
	 * @param inputName
	 * @param sytleAndAttrs
	 * @param defaultOption
	 * @param selectedValue
	 * @return
	 */
	public static String getSelectUserList(String acctTypeCode, String inputName, String rightGB, String sytleStr, String defaultOption, String selectedValue) {

        RowSet userRowSet = UserManager.getUserList(acctTypeCode, rightGB);

        return HTMLMaker.getSelectTag(userRowSet, "ACCT_ID", "USER_NAME_P", inputName, sytleStr, defaultOption, selectedValue);
    }

    /**
     * 사용자의 성명 직급을 리턴한다.
	 * @param acctID
	 * @return
	 */
	public static String getUserNamePosition(String acctID) {

        return getUserNamePosition(acctID, "");
    }
    
    /**
     * 사용자의 성명 직급을 리턴한다.
	 * @param acctID
	 * @param defaultValue
	 * @return
	 */
	public static String getUserNamePosition(String acctID, String defaultValue) {

        String temp = getUserInfoByAcctId(acctID).get("USER_NAME_P");
        
        if( temp == null || temp.equals("") ) {
            temp = defaultValue;
        }
        return temp;
    }

    /**
     * 사용자의 성명을 리턴한다.
	 * @param acctID
	 * @return
	 */
	public static String getUserName(String acctID) {

        return getUserName(acctID, "");
    }

    /**
     * 사용자의 성명을 리턴한다.
	 * @param acctID
	 * @param defaultValue
	 * @return
	 */
	public static String getUserName(String acctID, String defaultValue) {

        String temp = getUserInfoByAcctId(acctID).get("USER_NAME_K");
        
        if( temp == null || temp.equals("") ) {
            temp = defaultValue;
        }
        return temp;
    }

    /**
     * 사용자의 성명을 리턴한다.<br>
     * Parameter로 사번을 사용한다.
	 * @param sabun
	 * @return
	 */
	public static String getUserNameBySabun(String sabun) {

        return getUserNameBySabun(sabun, "");
    }

    /**
     * 사용자의 성명을 리턴한다.<br>
     * Parameter로 사번을 사용한다.
	 * @param sabun
	 * @param defaultValue
	 * @return
	 */
	public static String getUserNameBySabun(String sabun, String defaultValue) {

        String temp = getUserInfoByAcctId(sabun).get("USER_NAME_K");
        
        if( temp == null || temp.equals("") ) {
            temp = defaultValue;
        }
        return temp;
    }


    /**
	 * @param acctTypeCode
	 * @return
	 */
	public static RowSet getUserList(String acctTypeCode) {

        return getUserList(acctTypeCode, "");
    }

	/**
	 * @param acctTypeCode
	 * @param rightGB
	 * @return
	 */
	public static RowSet getUserList(String acctTypeCode, String rightGB) {

        String[] acctTypeCodeArray = getTokenArray(acctTypeCode, ",");
        UserManager userManager = new UserManager();
        return userManager.getUserRowSet(acctTypeCodeArray, rightGB);
    }

    /**
     * 사용자 정보를 리턴한다.
	 * @param acct_id
	 * @return
	 */
	public static ValueObject getUserInfoByAcctId(String acct_id) {

        if( acct_id != null && !acct_id.equals("") ) {

            UserManager userManager = new UserManager();
            return userManager.getUserValueObject(acct_id);
        }
        return new ValueObject();
    }

    /**
     * 사용자 정보를 리턴한다.<br>
     * Parameter로 사번을 사용한다.
	 * @param sabun
	 * @return
	 */
	public static ValueObject getUserInfoBySabun(String sabun) {

        if( sabun != null && !sabun.equals("") ) {

            UserManager userManager = new UserManager();
            return userManager.getUserValueObjectBySabun(sabun);
        }
        return new ValueObject();
    }

    /**
     * 해당사번에 등록된 인증서 DN 을 리턴한다.
     * 등록된 DN 이 없으면 계약용 인증서 DN을 리턴한다.
     * @param acctID 사용자 ID
	 * @return
	 */
	public static String getCertDN(String acctID) {

        return getCertDN(acctID, true);
    }

    /**
     * 해당사번에 등록된 인증서 DN 을 리턴한다.
	 * @param sabun 사용자 사번
	 * @param useCommonCertDN 해당사용자의 등록된 인증서가 없는 경우 공통 인증서를 리턴할지 여부
	 * @return
	 */
	public static String getCertDN(String acctID, boolean useCommonCertDN) {

        UserManager userManager = new UserManager();
        String certDN = userManager.getCertDNString(acctID);

        // 해당 사번에 사용자에 등록된 DN 이 없으면 공통 인증서 DN을 리턴한다.
        if( useCommonCertDN  && (certDN == null || certDN.equals("")) ) {
            certDN = WAFConfig.get("hwenc.cert_dn");
        }
        return certDN;
    }
    
    /**
     * 해당 계정에 등록된 권한구분을 리턴한다.
     * @param 권한계정
     * @param 
     * @return
     */
    public static String geUserRightGB(String acctID) {

        UserManager userManager = new UserManager();
        String rightGB = userManager.getUserValueObject(acctID).get("right_gb");

        return rightGB;
    }

    /**
     * 구매 -> 구매신청서 작성
     * 부서코드에 해당하는 사용자목록을 얻는다.
     * @param deptCd
	 * @return
	 */
	public static RowSet getUserListByDeptCd(String deptCd) {

        return getUserListByDeptCd(deptCd, "");
    }

    /**
     * 구매 -> 구매신청서 작성
     * 부서코드에 해당하는 사용자목록을 얻는다.
     * 2003-08-20 13:47:34 by hanajava
     * @param deptCd
     * @return
     */
    public static RowSet getUserListByDeptCd(String deptCD, String rightGB) {

        Search search = new SearchImpl();
        RowSet rowSet = null;
        String sqlstr = "";
        try {

			sqlstr += " SELECT   *                                                                       \n"
                    + " FROM                                                                             \n"
                    + " (                                                                                \n"
                    + " SELECT   *                                                                       \n"
                    + "  FROM     PUB0130V                                                               \n"
                    + "  WHERE                                                                           \n"
                    + "           PSOSO= '" + deptCD + "'                                                \n"
                    + "  AND       DUTYC <> '30'                                                         \n"
                    //+ "  AND       GRADE_CODE   <> '3'                                                    \n"
                    + "  AND      INACTIVE_DATE IS NULL                                                  \n";
            if( rightGB != null && !rightGB.equals("") ) {
                // 속도가 느려서 수정( C:담당자, D:결재자)
                if(rightGB.equals("C")){
                    sqlstr += " AND      RIGHT_GB <> 'D' \n";
                }else{
                    sqlstr += " AND      RIGHT_GB <> 'C' \n";
                }
                //sqlstr += " AND      RIGHT_GB = '" + rightGB + "' \n";
            } 
            sqlstr += "  UNION ALL                                                                       \n"
                    + "  SELECT   *                                                                      \n"
                    + "  FROM     PUB0130V                                                               \n"
                    + "  WHERE                                                                           \n"
                    + "           (BUSEO= '" + deptCD + "' OR DSO1 = '" + deptCD + "' OR DSO2 = '" + deptCD + "'  )  \n"
                    + "  AND       DUTYC <> '30'                                                         \n"
                    //+ "  AND       GRADE_CODE   <> '3'                                                    \n"
                    + "  AND      PSOSO IS NULL                                                          \n"
                    + "  AND      INACTIVE_DATE IS NULL                                                  \n";
            if( rightGB != null && !rightGB.equals("") ) {
                //속도가 느려서 수정( C:담당자, D:결재자)
                if(rightGB.equals("C")){
                    sqlstr += " AND      RIGHT_GB <> 'D' \n";
                }else{
                    sqlstr += " AND      RIGHT_GB <> 'C' \n";
                }
                //sqlstr += " AND      RIGHT_GB = '" + rightGB + "' \n";
            }                     


            sqlstr +=  "  )                                                                              \n"
                    + "  ORDER BY POSITION_SORT                                                          \n" ; 
                
            search.setStatement(sqlstr);
            rowSet = search.execute();
        }
        catch(Exception e) {
            WAFLogger.error("UserManager --> getUserListByDeptCd() : " + e.getMessage());
            WAFLogger.error("SQL : " + search.getStatement());
            WAFLogger.error(e);
        }
        finally {
            if( rowSet == null ) rowSet = new RowSetImpl();
            return rowSet;
        }
    }


    /**
     * 추가되는 Acct_Id를 선택 가능하도록 변경
     */
    public static RowSet getUserListByDeptCdAcctId(String deptCD, String rightGB, String AcctId) {

        Search search = new SearchImpl();
        RowSet rowSet = null;
        String sqlstr = "";
        try {
			sqlstr += " SELECT                                                                           \n"    //2007.08.09 수정 인덱스 소용없음, 인사급여->ehr
                    + "             *                                                                    \n"
                    + " FROM                                                                             \n"
                    + " (                                                                                \n"
                    + " SELECT   *                                                                       \n"
                    + "  FROM     PUB0130V                                                               \n"
                    + "  WHERE                                                                           \n"
                    + "           PSOSO= '" + deptCD + "'                                                \n"
                    + "  AND       DUTYC <> '30'                                                         \n"
                    + "  AND      INACTIVE_DATE IS NULL                                                  \n";
            if( rightGB != null && !rightGB.equals("") ) {
                // 속도가 느려서 수정( C:담당자, D:결재자)
                if(rightGB.equals("C")){
                    sqlstr += " AND      RIGHT_GB <> 'D' \n";
                }else{
                    sqlstr += " AND      RIGHT_GB <> 'C' \n";
                }
                //sqlstr += " AND      RIGHT_GB = '" + rightGB + "' \n";
            } 
            sqlstr += "  UNION ALL                                                                       \n"
                    + "  SELECT   *                                                                      \n"
                    + "  FROM     PUB0130V                                                               \n"
                    + "  WHERE                                                                           \n"
                    + "           (BUSEO= '" + deptCD + "' OR DSO1 = '" + deptCD + "' OR DSO2 = '" + deptCD + "'  )  \n"
                    + "  AND       DUTYC <> '30'                                                         \n"
                    + "  AND      PSOSO IS NULL                                                          \n"
                    + "  AND      INACTIVE_DATE IS NULL                                                  \n";
            if( rightGB != null && !rightGB.equals("") ) {
                //속도가 느려서 수정( C:담당자, D:결재자)
                if(rightGB.equals("C")){
                    sqlstr += " AND      RIGHT_GB <> 'D' \n";
                }else{
                    sqlstr += " AND      RIGHT_GB <> 'C' \n";
                }
                //sqlstr += " AND      RIGHT_GB = '" + rightGB + "' \n";
            }                     
            sqlstr +=  " UNION ALL                                                                       \n"
                    +  " SELECT * FROM PUB0130V WHERE ACCT_ID = "+AcctId+"                               \n";

            sqlstr +=  "  )                                                                              \n"
                    + "  ORDER BY POSITION_SORT                                                          \n" ; 
                
         /*  
            sqlstr += " SELECT   *                                                            \n"
                    + " FROM     PUB0130V                                                     \n"
                    + " WHERE    DECODE(NVL(PSOSO, ''), '', BUSEO, PSOSO) = '" + deptCD + "'  \n"
                    + " AND      INACTIVE_DATE IS NULL                                        \n" ;

            if( rightGB != null && !rightGB.equals("") ) {

                sqlstr += " AND      RIGHT_GB = '" + rightGB + "' \n";
            }

            sqlstr += " ORDER BY POSITION_SORT \n" ; 
        */
            search.setStatement(sqlstr);
            rowSet = search.execute();
        }
        catch(Exception e) {
            WAFLogger.error("UserManager --> getUserListByDeptCd() : " + e.getMessage());
            WAFLogger.error("SQL : " + search.getStatement());
            WAFLogger.error(e);
        }
        finally {
            if( rowSet == null ) rowSet = new RowSetImpl();
            return rowSet;
        }
    }

   
    
    /**
     * 해당사번에 등록된 DN을 리턴한다.
	 * @param sabun
	 * @return
	 */
	private String getCertDNString(String acctID) {

        Search search = new SearchImpl();
        String certDN = "";
        String sqlstr = "";
        try {

            sqlstr = " SELECT   CERT_DN     \n"
                   + " FROM     PUB0120T    \n"
                   + " WHERE    ACCT_ID = ? \n";
    

            search.setStatement(sqlstr);
            search.addParameter(acctID);
            certDN = search.execute().getRow(0).get("CERT_DN");
        }
        catch(Exception e) {
            WAFLogger.error(this.getClass().getName() + " --> getCertDNString() : " + e.getMessage());
            WAFLogger.error("SQL : " + search.getStatement());
            WAFLogger.error(e);
        }
        finally {
            if( certDN == null ) certDN = "";
            return certDN;
        }
    }
    private RowSet getUserRowSet(String[] acctTypeCodeArray, String rightGB) {

        Search search = new SearchImpl();
        RowSet rowSet = null;
        String sqlstr = "";
        String acctTypeCode = "";
        String openUserYN = "N";
        try {

            for( int i = 0 ; i < acctTypeCodeArray.length ; i++ ) {

                if( i == acctTypeCodeArray.length - 1 ) {

                    acctTypeCode += " '" + acctTypeCodeArray[i] + "' ";
                }
                else {

                    acctTypeCode += " '" + acctTypeCodeArray[i] + "' , ";
                }
                
                //계정타입에 OpenUser값을 넘기면 개봉자 리스트를 보여준다.
                if(acctTypeCodeArray[i].equals("OPENUSER") && openUserYN.equals("N") ){
                    openUserYN = "Y";
                }
            }

            sqlstr = " SELECT   *                       \n"
                   + " FROM     PUB0130V                \n"
                   + " WHERE    INACTIVE_DATE IS NULL   \n"
                   + " AND      DUTYC != '30'           \n";

            if( rightGB != null && !rightGB.equals("") ) {

                sqlstr += " AND      RIGHT_GB = '" + rightGB + "' ";
            }

            if( acctTypeCode != null && !acctTypeCode.equals("") ) {
                   
                sqlstr += " AND      ACCT_TYPE_CODE IN ( " + acctTypeCode + " ) \n";
            }

            //개봉자리스트를 보여줄때
            if(openUserYN.equals("Y")){
                sqlstr += " AND      CERT_DN IS NOT NULL                        \n"; 
            }
            
            sqlstr += " ORDER BY POSITION_SORT " ;
    
            search.setStatement(sqlstr);
            rowSet = search.execute();
        }    
        catch(Exception e) {
            WAFLogger.error(this.getClass().getName() + " --> getUserRowSet() : " + e.getMessage());
            WAFLogger.error("SQL : " + search.getStatement());
            WAFLogger.error(e);
        }
        finally {
            if( rowSet == null ) rowSet = new RowSetImpl();
            return rowSet;
        }
    
    }

    /**
     * 사용자 정보를 ID로 조회 리턴
	 * @param acct_id
	 * @return <code>ValueObject</code> 사용자 정보
	 * @throws Exception
	 */
	private ValueObject getUserValueObject(String acctID) {

        Search search = new SearchImpl();
        ValueObject valueObject  = null;
        String sqlstr = "";
        try {
            sqlstr = " SELECT   *             \n"
                   + " FROM     PUB0130V      \n"
                   + " WHERE    ACCT_ID = ?   \n";
            search.setStatement(sqlstr);
            search.addParameter(acctID);
            RowSet rowSet = search.execute();
            if( rowSet != null && rowSet.size() > 0 ) {
                valueObject = RowSetUtility.getValueObject(rowSet.getRow(0));
            }
        }
        catch(Exception e) {
            WAFLogger.error(this.getClass().getName() + " --> getUserValueObject() : " + e.getMessage());
            WAFLogger.error("SQL : " + search.getStatement());
            WAFLogger.error("ACCT_ID : " + acctID);
            WAFLogger.error(e);
        }
        finally {
            if( valueObject == null ) valueObject = new ValueObject();
            return valueObject;
        }
    }


    /**
     * 사번으로 사용자 정보를 조회 리턴
	 * @param userSabun
	 * @return <code>ValueObject</code>  사용자 정보
	 * @throws Exception
	 */
	private ValueObject getUserValueObjectBySabun(String userSabun) {

        Search search = new SearchImpl();
        ValueObject valueObject  = null;
        String sqlstr = "";
        try {

            sqlstr = " SELECT   *              \n"
                   + " FROM     PUB0130V       \n"
                   + " WHERE    USER_SABUN = ? \n";
    
            search.setStatement(sqlstr);
            search.addParameter(userSabun);
            valueObject = RowSetUtility.getValueObject(search.execute().getRow(0));
        }
        catch(Exception e) {
            WAFLogger.error(this.getClass().getName() + " --> getUserValueObjectBySabun() : " + e.getMessage());
            WAFLogger.error("SQL : " + search.getStatement());
            WAFLogger.error(e);
        }
        finally {
            if( valueObject == null ) valueObject = new ValueObject();
            return valueObject;
        }
    }

    /**
     * 사용자 계정 ID 리턴
     * @param connection
     * @return
     * @throws Exception
     */
    public String getAcctID(Connection connection) throws Exception {

        Persistent persistent = new PersistentImpl(connection);
        String sqlstr = "";
        try {

            sqlstr += " SELECT PUB0120T_S.NEXTVAL AS ACCT_ID \n"
                    + " FROM   DUAL                          \n" ;
            persistent.setStatement(sqlstr);
            return persistent.query().getRow(0).get("ACCT_ID");
        }
        catch(Exception e) {

            WAFLogger.error(this.getClass().getName() + " --> getAcctID() : " + e.getMessage());
            WAFLogger.error("SQL : " + sqlstr);
            WAFLogger.error(e);
            throw e;
        }
    }

    /**
     * 스트링을 strDelim으로 잘라 String[] 로 리턴을 한다.
	 * @param str
	 * @param strDelim
	 * @return
	 */
	private static String[] getTokenArray(String str, String strDelim) {

        if( str == null || str.length() == 0 )
        {
            String[] temp = {""};
            return temp;
        }

        StringTokenizer st = new StringTokenizer(str, strDelim);

        if( st.countTokens() == 0 ) {
            String[] arrToken = new String[1];
            arrToken[0] = str;
            return arrToken;
        }

        String[] arrToken = new String[st.countTokens()];
        for( int i = 0 ; i < arrToken.length ; i++ )
            arrToken[i] = st.nextToken().trim();

        return arrToken;
    }
}