//===========================================================================
// package
//===========================================================================
package jp.gr.java_conf.bugslife.user;

//===========================================================================
// import
//===========================================================================
// Java core API
import java.util.*;
import java.text.*;

// DB API
import jp.gr.java_conf.bugslife.db.*;

// Util API
import jp.gr.java_conf.bugslife.util.*;
//import jp.gr.java_conf.bugslife.system.*;


/**
 *<PRE>
 * 
 * UserInfoクラス
 * 
 *</PRE>
 * @version	0.0, 2001/09/10
 * @author	鰐川　正寛
 */
//===========================================================================
public class UserInfo implements IUpdatable, ILoadable
{
//===========================================================================
// attributes
//===========================================================================
	/**
	 *	ユーザ番号
	 */
	private int m_uno = 0;
	/**
	 *	ユーザID
	 */
	private String m_uid = null;
	/**
	 *	パスワード
	 */
	private String m_password = null;
	/**
	 *	名前
	 */
	private String m_name = null;
	/**
	 *	略称
	 */
	private String m_nickname = null;
	/**
	 *	eメール
	 */
	private String m_email = null;
	/**
	 *	会社名
	 */
	private String m_company = null;
	/**
	 *	部署
	 */
	private String m_section = null;
	/**
	 *	電話
	 */
	private String m_tel = null;
	/**
	 *	メモ
	 */
	private String m_memo = null;
	/**
	 *	表示フラグ
	 */
	private byte m_dispFlag = DISPLAY;
	public static final int NOT_DISPLAY	= 0;	//表示不可
	public static final int DISPLAY	= 1;		//表示可
	/**
	 *	ユーザ情報
	 */
	private String m_info = null;
	/**
	 *	権限
	 */
	private int m_permission = GUEST;
	public static final int SYSTEM_MANAGER	= 32;	//システム管理者
	public static final int PROJECT_MANAGER	= 16;	//プロジェクト管理者
	public static final int DEVELOPER		= 8;	//開発者
	public static final int TESTER		 	= 4;	//テスター
	public static final int USER		 	= 2;	//ユーザ
	public static final int GUEST		 	= 1;	//ゲスト
	/**
	 *	メール購読
	 */
	private int m_mailSubscription;
	public static final int MAIL_DETAIL0	= 0x40000000;	//新規
	public static final int MAIL_DETAIL1	= 0x20000000;	//故障
	public static final int MAIL_DETAIL2	= 0x10000000;	//方針
	public static final int MAIL_DETAIL3	= 0x08000000;	//解析
	public static final int MAIL_DETAIL4	= 0x04000000;	//修正
	public static final int MAIL_DETAIL5	= 0x01000000;	//確認
	/**
	 *	最終ログオフ日時
	 */
	private Date m_lastLogoffDate = null;
	/**
	 *	更新者
	 */
	private int m_updateUno = 0;
	/**
	 *	更新日時
	 */
	private Date m_updateDate = new Date();
//=====================================
// ユーザコレクション
//=====================================
	/**
	 *	ユーザ
	 */
//	private static Map m_map = null;
//=====================================
// DB用項目定義
//=====================================
	/**
	 * 排他制御
	 */
	private static final boolean m_exclusion = true;	//あり
	/**
	 * AutoIncrement
	 */
	private static final boolean m_atoIncrement = true;	//あり
	/**
	 * PK 
	 */
	private static final String[] PK = {"uno"};
	/**
	 * 更新項目名
	 */
	private static final String[] DB_ITEMS = {
									"uid","password","name",
									"nickname","email","company",
									"section","tel","memo", "dispFlag",
									"permission","mailSubscription","lastLogoffDate",
									"info","updateUno" };
//===========================================================================
// methods
//===========================================================================
	/**
	 *	デフォルトコンストラクタ
	 *
	 */
	public UserInfo()
	{
		
	}
	/**
	 *	コンストラクタ(ユーザ番号）
	 *
	 * @param	uid		String型
	 */
	public UserInfo(int uno)
	{
		setUno(uno);
		
		load();
		
	}
//======================================
// db access methods
//======================================
	/**
	 *	insertDB
	 *
	 * @return	処理結果
	 */
	public void insert(int updateUno)
	{
		setUpdateUno(updateUno);
		setUpdateDate(new Date());
		int uno = DAO.insert(this);
		setUno(uno);
		
		load();		//最終更新日がほしいので再ロード
		
//		putMap(this);
	}
	/**
	 *	update
	 *
	 * @return	処理結果
	 */
	public void update(int updateUno)
	{
		setUpdateUno(updateUno);
		DAO.update(this);
		
		load();		//最終更新日がほしいので再ロード
		//debug
		debug("update after:updateDate = " + m_updateDate);
		
//		putMap(this);
	}
	/**
	 *	delete
	 *
	 * @return	処理結果
	 */
	public void delete(int updateUno)
	{
		setUpdateUno(updateUno);
		DAO.delete(this);
		
//		removeMap(this);
	}
	/**
	 *	load
	 *
	 * @return	処理結果
	 */
	public void load()
	{
		
		DAO.load(this);
		
	}
	/**
	 *	findAll
	 *
	 * @return	処理結果
	 */
	public static Collection findAll()
	{
		
		return DAO.findAll(new UserInfo());
		
	}
	/**
	 *	findUid
	 *
	 * @return	処理結果
	 */
	public static UserInfo findUid(String uid)
	{
		
		String sql = "SELECT * FROM UserInfo WHERE uid = ?";
		ArrayList params = new ArrayList();
		params.add(uid);
		
		ArrayList list = DAO.find(new UserInfo(), sql, params);
		
		UserInfo userInfo = null;
		if ((list != null) && (list.size() > 0)) {
			userInfo = (UserInfo)list.get(0);
		}
		return userInfo;
	}
//======================================
// Db Interface
//======================================
	/**
	 * 
	 */
	public String[] getUpdateItemNames() {
		
		return DB_ITEMS;
		
	}
	/**
	 * PK items
	 */
	 public String[] getPKItems() {
		return PK;
	}
	/**
	 * 排他制御ありなし
	 */
	public boolean isExclusion() {
		return true;
	}
	/**
	 * AutoIncrementありなし
	 */
	public boolean isAutoIncrement() {
		return true;
	}
//======================================
// Collection
//======================================
	/**
	 *	全ユーザの取得
	 *
	 * @return	処理結果
	 */
	public static Collection getAllUser()
	{
		String sql = "SELECT * FROM UserInfo WHERE dispFlag = 1 ORDER BY nickName";
		ArrayList params = new ArrayList();
		
		return (DAO.find(new UserInfo(), sql, params));
	}
	/**
	 *	ユーザの取得（権限指定）
	 *
	 * @return	処理結果
	 */
	public static Collection getPermissionUser(int permission)
	{
		String sql = "SELECT * FROM UserInfo WHERE permission >= ? AND dispFlag = 1 ORDER BY nickName";
		ArrayList params = new ArrayList();
		params.add(new Integer(permission));
		
		return (DAO.find(new UserInfo(), sql, params));
	}
	/**
	 *	ユーザの取得（ユーザ番号指定）
	 *
	 * @return	処理結果
	 */
	public static UserInfo getUser(int uno)
	{
		String sql = "SELECT * FROM UserInfo WHERE uno = ?";
		ArrayList params = new ArrayList();
		params.add(new Integer(uno));
		
		ArrayList list = DAO.find(new UserInfo(), sql, params);
		
		UserInfo userInfo = null;
		if ((list != null) && (list.size() > 0)) {
			userInfo = (UserInfo)list.get(0);
		}
		return userInfo;
	}
	/**
	 *	ユーザの取得（E-mail指定）
	 *
	 * @return	処理結果
	 */
	public static UserInfo getUserForEmail(String email)
	{
		String sql = "SELECT * FROM UserInfo WHERE email = ?";
		ArrayList params = new ArrayList();
		params.add(email);
		
		ArrayList list = DAO.find(new UserInfo(), sql, params);
		
		UserInfo userInfo = null;
		if ((list != null) && (list.size() > 0)) {
			userInfo = (UserInfo)list.get(0);
		}
		return userInfo;
	}
	/**
	 *	ユーザの取得（E-mail購読指定）
	 *
	 * @return	処理結果
	 */
	public static Collection getUserForMailType(int type)
	{
		String sql = "SELECT * FROM UserInfo WHERE mailSubscription & ?";
		ArrayList params = new ArrayList();
		params.add(new Integer(type));
		
		return DAO.find(new UserInfo(), sql, params);
	}
//======================================
// request param
//======================================
	/**
	 *	request parametorの生成
	 */
	public Map getMapping() {
	
		HashMap map = new HashMap();
		map.put("uno", Integer.toString(getUno()));
		return map;
	}
//======================================
// Property
//======================================
	/**
	 * ユーザ番号の取得
	 * 
	 * @return ユーザ番号
	 */
	public int getUno()
	{
		return m_uno;
	}
	/**
	 * ユーザ番号のセット
	 * 
	 * @param uno ユーザ番号
	 */
	public void setUno(int uno)
	{
		m_uno = uno;
	}
	/**
	 * ユーザ番号の取得（文字列）
	 * 
	 * @return ユーザ番号
	 */
	public String getUnoString()
	{
		String s;
		if (m_uno == 0) {
			s = "#";
		} else {
			s = new Integer(m_uno).toString();
		}
		return s;
	}
	/**
	 * ユーザＩＤの取得
	 * 
	 * @return ユーザＩＤ
	 */
	public String getUid()
	{
		return m_uid;
	}
	/**
	 * ユーザＩＤのセット
	 * 
	 * @param uid ユーザＩＤ
	 */
	public void setUid(String uid)
	{
		m_uid = uid;
	}
	/**
	 * パスワードの取得
	 * 
	 * @return パスワード
	 */
	public String getPassword()
	{
		return m_password;
	}
	/**
	 * パスワードのセット
	 * 
	 * @param password パスワード
	 */
	public void setPassword(String password)
	{
		m_password = password;
	}
	/**
	 * 名前の取得
	 * 
	 * @return 名前
	 */
	public String getName()
	{
		return m_name;
	}
	/**
	 * 名前のセット
	 * 
	 * @param name 名前
	 */
	public void setName(String name)
	{
		m_name = name;
	}
	/**
	 * 略称の取得
	 * 
	 * @return 略称
	 */
	public String getNickname()
	{
		return m_nickname;
	}
	/**
	 * 略称のセット
	 * 
	 * @param nickname 略称
	 */
	public void setNickname(String nickname)
	{
		m_nickname = nickname;
	}
	/**
	 * 略称の取得(文字列)
	 * 
	 * @return 略称
	 */
	public String getNicknameString()
	{
		//新規の場合はnullにならない様に
		return (m_uno == 0 ? "名無し" : m_nickname);
	}
	/**
	 *	Eメールのセット
	 *
	 * @param	email		Eメール
	 */
	public void setEmail(String email)
	{
		m_email = email;
	}
	/**
	 *	Eメールの取得
	 *
	 * @return	email		Eメール
	 */
	public String getEmail()
	{
		return m_email;
	}
	/**
	 *	会社のセット
	 *
	 * @param	company		会社
	 */
	public void setCompany(String company)
	{
		m_company = company;
	}
	/**
	 *	会社の取得
	 *
	 * @return	company		会社
	 */
	public String getCompany()
	{
		return m_company;
	}
	/**
	 *	部署のセット
	 *
	 * @param	section		部署
	 */
	public void setSection(String section)
	{
		m_section = section;
	}
	/**
	 *	部署の取得
	 *
	 * @return	section		部署
	 */
	public String getSection()
	{
		return m_section;
	}
	/**
	 *	TELのセット
	 *
	 */
	public void setTel(String tel)
	{
		m_tel = tel;
	}
	/**
	 *	TELの取得
	 *
	 * @return	tel		TEL
	 */
	public String getTel()
	{
		return m_tel;
	}
	/**
	 *	権限の取得
	 *
	 * @return	permission		権限
	 */
	public int getPermission()
	{
		return m_permission;
	}
	/**
	 *	権限のチェック
	 *
	 * @return	permission		権限
	 */
	public boolean isForgiven(int permission)
	{
		return ((m_permission & permission) > 0 ? true : false);
	}
	/**
	 *	権限の取得
	 *
	 * @return	permission		権限
	 */
	public void setPermission(int permission)
	{
		m_permission = permission;
	}
	/**
	 *	権限(文字列)の取得
	 *
	 * @return	permission		権限
	 */
	public String getPermissionString()
	{
		StringBuffer sb = new StringBuffer();
		if ((m_permission & SYSTEM_MANAGER) > 0) {
			sb.append("システム管理者<br>");
		}
		if ((m_permission & PROJECT_MANAGER) > 0) {
			sb.append("プロジェクト管理者<br>");
		}
		if ((m_permission & DEVELOPER) > 0) {
			sb.append("開発者<br>");
		}
		if ((m_permission & TESTER) > 0) {
			sb.append("テスター<br>");
		}
		if ((m_permission & USER) > 0) {
			sb.append("ユーザ<br>");
		}
		if ((m_permission & GUEST) > 0) {
			sb.append("ゲスト<br>");
		}
		return new String(sb);
	}
	/**
	 * メモの取得
	 * 
	 * @return メモ
	 */
	public String getMemo()
	{
		return m_memo;
	}
	/**
	 * メモのセット
	 * 
	 * @param memo メモ
	 */
	public void setMemo(String memo)
	{
		m_memo = memo;
	}
	/**
	 * 表示フラグの取得
	 * 
	 * @return 表示フラグ
	 */
	public byte getDispFlag()
	{
		return m_dispFlag;
	}
	/**
	 * 表示フラグのセット
	 * 
	 * @param dispFlag 表示フラグ
	 */
	public void setDispFlag(byte dispFlag)
	{
		m_dispFlag = dispFlag;
	}
	/**
	 * 表示フラグ可不可判定
	 * 
	 * @return 表示フラグ
	 */
	public boolean isDisplay()
	{
		return (m_dispFlag == DISPLAY);
	}
	/**
	 * ユーザ情報の取得
	 * 
	 * @return ユーザ情報
	 */
	public String getInfo()
	{
		return m_info;
	}
	/**
	 * ユーザ情報のセット
	 * 
	 * @param Info ユーザ情報
	 */
	public void setInfo(String info)
	{
		m_info = info;
	}
	/**
	 * 最終ログオフ日時の取得
	 * 
	 * @return 最終ログオフ日時
	 */
	public Date getLastLogoffDate()
	{
		return m_lastLogoffDate;
	}
	/**
	 * 最終ログオフ日時の取得
	 * 
	 * @return 最終ログオフ日時
	 */
	public String getLastLogoffDateString()
	{
		return Converter.getDateString(m_lastLogoffDate, Converter.SHORT_DATE_TIME);
	}
	/**
	 * 最終ログオフ日時のセット
	 * 
	 * @param lastLogoffDate 最終ログオフ日時
	 */
	public void setLastLogoffDate(Date lastLogoffDate)
	{
		m_lastLogoffDate = lastLogoffDate;
	}
	/**
	 * メール購読の取得
	 * 
	 * @return メール購読
	 */
	public int getMailSubscription()
	{
		return m_mailSubscription;
	}
	/**
	 * メール購読の確認
	 * 
	 * @return 
	 */
	public boolean isSubscription(int mailType)
	{
		return ((m_mailSubscription & mailType) > 0 ? true : false);
	}
	/**
	 * メール購読のセット
	 * 
	 * @param mailSubscription1 メール購読１
	 */
	public void setMailSubscription(int mailSubscription)
	{
		m_mailSubscription = mailSubscription;
	}
	/**
	 * 更新者の取得
	 * 
	 * @return 更新者
	 */
	public int getUpdateUno()
	{
		return m_updateUno;
	}
	/**
	 * 更新者のセット
	 * 
	 * @param updateUno 更新者
	 */
	public void setUpdateUno(int updateUno)
	{
		m_updateUno = updateUno;
	}
	/**
	 *	更新日の取得
	 *
	 * @return	update		更新日文字列
	 */
	public Date getUpdateDate()
	{
		return m_updateDate;
	}
	/**
	 *	更新日のセット
	 *
	 * @return	update		更新日文字列
	 */
	public void setUpdateDate(Date date)
	{
		m_updateDate = date;
	}
//===========================================================================
// methods
//===========================================================================
	/**
	 *	クラス情報
	 */
	public String toString()
	{
		StringBuffer sb = new StringBuffer();
		sb.append("--- [USER INFO] --- \n");
		sb.append("uno     : " + m_uno + "\n");
		sb.append("uid     : " + m_uid + "\n");
		sb.append("password: " + m_password + "\n");
		sb.append("name    : " + m_name + "\n");
		sb.append("nickname: " + m_nickname + "\n");
		sb.append("email   : " + m_email + "\n");
		sb.append("company : " + m_company + "\n");
		sb.append("section : " + m_section + "\n");
		sb.append("tel     : " + m_tel + "\n");
		sb.append("memo    : " + m_memo + "\n");
		sb.append("dispFlag: " + m_dispFlag + "\n");
		sb.append("info    : " + m_info + "\n");
		sb.append("permission : " + m_permission + "\n");
		sb.append("updateUno  : " + m_updateUno + "\n");
		sb.append("updateDate : " + m_updateDate + "\n");
		sb.append("--- [USER INFO] --- \n");
		return sb.toString();
	}
	/**
	 * debug
	 */
	private static void debug(String s) {
		 
		 System.out.println("[UserInfo]" + s);
		 
	}
	/**
	 *	テストメイン
	 */
	public static void main(String[] args)
	{
		System.out.println("------- << UserInfo Test Start >> -----------");
		
/*-------------------------------
		unitTest1();	//新規ユーザ作成テスト
		unitTest2();	//ユーザ更新テスト
		unitTest3();	//ユーザ削除テスト
		unitTest4();	//全件取得テスト
		unitTest5();	//ユーザID検索テスト
		unitTest6();	//ユーザ番号指定コンストラクトテスト
		unitTest7();	//全ユーザ取得テスト
		unitTest8();	//特権ユーザ取得テスト
-------------------------------*/
		unitTest9();	//メール購読指定取得テスト
		
		System.out.println("------- << UserInfo Test End >> -----------");
	}
	
	/**
	 *	unitTest1
	 *
	 * 新規ユーザ作成テスト
	 *
	 */
	public static void unitTest1()
	{
		System.out.println("------- unitTest1 -----------");
		
		UserInfo userInfo = new UserInfo();
		
		userInfo.setUid("test");
		userInfo.setPassword("test");
		userInfo.setName("表");
		userInfo.setName("テスト太郎");
		userInfo.setEmail("test@email.co.jp");
		userInfo.setCompany("ソラン");
		userInfo.setSection("公共事業部第１グループ");
		userInfo.setTel("012-3456-7890");
		userInfo.setMemo("メモ");
		userInfo.setDispFlag((byte)1);
		userInfo.setInfo("このユーザの追加情報");
		userInfo.setPermission(8+4+2+1);
		userInfo.setUpdateUno(1);
		//削除
//		userInfo.delete();
		//追加
		userInfo.insert(0);
		
		System.out.println(userInfo.toString());
	}
	/**
	 *	unitTest2
	 *
	 * ユーザ更新テスト
	 *
	 */
	public static void unitTest2()
	{
		System.out.println("------- unitTest2 -----------");
		
		UserInfo userInfo = new UserInfo();
		
		//読み込み
		userInfo.setUno(3);
		userInfo.load();
		System.out.println(userInfo.toString());
		
		userInfo.setUid("test");
		userInfo.setPassword("test");
		userInfo.setName("更新2");
		userInfo.setEmail("test@email.co.jp");
		userInfo.setCompany("ソラン");
		userInfo.setSection("公共事業部第１グループ");
		userInfo.setTel("012-3456-7890");
		userInfo.setMemo("メモ");
		userInfo.setDispFlag((byte)1);
		userInfo.setInfo("このユーザの追加情報");
		userInfo.setPermission(8+4+2+1);
		userInfo.setUpdateUno(1);
		//更新
		userInfo.update(0);
		
		System.out.println(userInfo.toString());
	}
	/**
	 *	unitTest3
	 *
	 * ユーザ削除テスト
	 *
	 */
	public static void unitTest3()
	{
		System.out.println("------- unitTest3 -----------");
		
		UserInfo userInfo = new UserInfo();
		
		//読み込み
		userInfo.setUno(2);
		userInfo.load();
		System.out.println(userInfo.toString());
		
		//削除
		userInfo.delete(2);
		
		UserInfo userInfo2 = new UserInfo();
		
		//読み込み
		userInfo2.setUno(2);
		userInfo2.load();
		System.out.println(userInfo.toString());
	}
	/**
	 *	unitTest4
	 *
	 * 全件取得テスト
	 *
	 */
	public static void unitTest4()
	{
		System.out.println("------- unitTest4 -----------");
		
		Collection users = UserInfo.findAll();
		dispUser(users);
	}
	/**
	 *	unitTest5
	 *
	 * ユーザID検索テスト
	 *
	 */
	public static void unitTest5()
	{
		System.out.println("------- unitTest5 -----------");
		
		UserInfo userInfo = UserInfo.findUid("TESTER");
		
		System.out.println(userInfo.toString());
	}
	/**
	 *	unitTest6
	 *
	 * ユーザ番号コンストラクトテスト
	 *
	 */
	public static void unitTest6()
	{
		System.out.println("------- unitTest6 -----------");
		
		UserInfo userInfo = new UserInfo(4);
		
		System.out.println(userInfo.toString());
	}
	/**
	 *	unitTest7
	 *
	 * 全ユーザ取得テスト
	 *
	 */
	public static void unitTest7()
	{
		System.out.println("------- unitTest7 -----------");
		
		Collection users = UserInfo.getAllUser();
		dispUser(users);
		
	}
	/**
	 *	unitTest8
	 *
	 * ユーザ取得テスト（パーミッション指定）
	 *
	 */
	public static void unitTest8()
	{
		System.out.println("------- unitTest8 -----------");
		
		Collection users = null;
		
		users = UserInfo.getPermissionUser(SYSTEM_MANAGER);
		System.out.println("SYSTEM_MANAGER");
		dispUser(users);
		
		users = UserInfo.getPermissionUser(PROJECT_MANAGER);
		System.out.println("PROJECT_MANAGER");
		dispUser(users);
		
		users = UserInfo.getPermissionUser(DEVELOPER);
		System.out.println("DEVELOPER");
		dispUser(users);
		
		users = UserInfo.getPermissionUser(TESTER);
		System.out.println("TESTER");
		dispUser(users);
		
		users = UserInfo.getPermissionUser(USER);
		System.out.println("USER");
		dispUser(users);
		
		users = UserInfo.getPermissionUser(GUEST);
		System.out.println("GUEST");
		dispUser(users);
		
		users = UserInfo.getPermissionUser(PROJECT_MANAGER + DEVELOPER);
		System.out.println("PROJECT_MANAGER + DEVELOPER");
		dispUser(users);
	}
	/**
	 *	unitTest9
	 *
	 * ユーザ取得テスト（メール購読指定）
	 *
	 */
	public static void unitTest9()
	{
		System.out.println("------- unitTest9 -----------");
		
		Collection users = null;
		
		users = UserInfo.getUserForMailType(UserInfo.MAIL_DETAIL0);
		System.out.println("新規");
		dispUser(users);
		users = UserInfo.getUserForMailType(UserInfo.MAIL_DETAIL1);
		System.out.println("故障");
		dispUser(users);
		users = UserInfo.getUserForMailType(UserInfo.MAIL_DETAIL2);
		System.out.println("方針");
		dispUser(users);
		users = UserInfo.getUserForMailType(UserInfo.MAIL_DETAIL3);
		System.out.println("解析");
		dispUser(users);
		users = UserInfo.getUserForMailType(UserInfo.MAIL_DETAIL4);
		System.out.println("修正");
		dispUser(users);
		users = UserInfo.getUserForMailType(UserInfo.MAIL_DETAIL5);
		System.out.println("確認");
		dispUser(users);
	}
	/**
	 * ユーザリストの表示
	 *
	 */
	private static void dispUser(Collection users)
	{
		Iterator ite = users.iterator();
		
		while(ite.hasNext()) {
			UserInfo user = (UserInfo)ite.next();
			
			System.out.println(user.getUno() + "-" + user.getNickname());
		}
	}
}