김대니 2020. 5. 22. 13:51
package memberManager;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/*
 * 
 * 
 */

class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		// 여러곳에서 자주 사용되는 로직을 담는다.
		DB db = new DB();
		db.loadGlobal();
		// 데이터 Access Object, 오직 이 객체가, 실제로 어디에 파일이 저장되고,
		// 어떤 형태로(XML 또는 JSON) 저장되는지 알고 있다.
		MemberDao articleDao = new MemberDao(db);
		// 핵심로직을 담고 있다.
		MemberService articleService = new MemberService(articleDao);
		// 고객의 요청을 받아서 service의 적절한 기능 호출
		MemberController controller = new MemberController(articleService);
		controller.setScanner(scanner);

		while (true) {
			controller.shwHelp();
			System.out.print(" > ");
			String cmd = scanner.next().trim();
			if (cmd.equals("join")) {
				scanner.nextLine();
				controller.doCommandJoin();
			} else if (cmd.equals("help")) {
				controller.shwHelp();
//			} else if (cmd.equals("modify")) {
//				scanner.nextLine();
//				controller.doCommandModify();
			} else if (cmd.equals("login")) {
				scanner.nextLine();
//				controller.doCommandLonIn();
//			} else if (cmd.equals("logout")) {
//				scanner.nextLine();
//				controller.doCommandLogOut();
			} else if (cmd.equals("exit")) {
				System.out.println("프로그램을 종료합니다.");
				break;
			}
		}
		scanner.close();

	}
}

class MemberController {
	MemberService memberService;
	Scanner scanner;
	Member loggedInMember;

	MemberController(MemberService memberService) {
		this.memberService = memberService;
		loggedInMember = null;
	}

	public void doCommandJoin() {
		System.out.println("== 회원가입 ==");

		String id;
		String pw;
		String pwCheck;
		String nickName;

		while (true) {
			System.out.printf("사용하실 아이디를 입력해 주십시오.%n");
			System.out.printf(" >");
			id = scanner.next().trim();
			if (id.length() == 0) {
				System.out.println("아이디를 입력해 주십시요.");
				continue;
			}
			if (id.length() < 3) {
				System.out.println("아이디는 3자 이상이어야 합니다.");
				continue;
			}
			if (memberService.isUsedId(id) == true ) {
				System.out.println("이미 사용중인 아이디 입니다.");
				continue;
			}
			break;
		}
		while (true) {
			boolean pwValid = true;
			while (true) {
				System.out.printf("사용하실 비밀번호를 입력해 주십시오.%n");
				System.out.printf(" >");
				pw = scanner.next().trim();
				if (pw.length() == 0) {
					System.out.println("비밀번호를 입력해 주십시요.");
					continue;
				}
				if (pw.length() < 4) {
					System.out.println("비밀번호는 4자 이상이어야 합니다.");
					continue;
				}
				break;
			}
			while (true) {
				System.out.println("로그인 비밀번호 확인 : ");
				System.out.printf(" >");
				pwCheck = scanner.next().trim();
				if (pwCheck.length() == 0) {
					System.out.println("비밀번호 확인을 위해 비밀번호를 다시 입력해주십시오.");
					continue;
				}
				if (pwCheck.equals(pw) == false) {
					System.out.println("입력한 비밀번호가 일치하지 않습니다.");
					pwValid = false;
					break;
				}
				break;
			}
			if (pwValid) {
				break;
			}
		}
		
		System.out.printf("사용하실 닉네임을 입력해 주십시오.%n");
		System.out.printf(" >");
		nickName = scanner.next().trim();
		
		System.out.printf("아이디 : %s 비밀번호 : %s 닉네임 : %s%n", id, pw, nickName);
		System.out.println("이대로 진행하시겠습니까? y / n");
		System.out.print("> ");
		String yn = scanner.next().trim();
		if (yn.equals("y")) {
			memberService.join(id, pw, nickName);
			System.out.printf("%s님의 회원가입을 환영합니다.%n%n", nickName);
			
		}
	}

	public void doCommandLonIn() {
		System.out.println("== 로그인 ==");
		System.out.printf("아이디를 입력해 주십시오.%n");
		System.out.printf(">");
		String id = scanner.next().trim();
		System.out.printf("비밀번호를 입력해 주십시오.%n");
		System.out.printf(">");
		String pw = scanner.next().trim();

		memberService.login(id, pw);
	}
//	public void doCommandModify() {
//	}
//	public void doCommandLogOut() {
//	}

	public void shwHelp() {
		System.out.println("== 회원 관리 프로그램 ==");
		System.out.printf("join - 회원가입%n");
		System.out.printf("login - 로그인%n");
		System.out.printf("logout - 로그아웃%n");
		System.out.printf("modify - 회원 정보 수정%n");
		System.out.printf("exit - 프로그램 종료%n");
	}

	public void setScanner(Scanner scanner) {
		this.scanner = scanner;
	}
}

class MemberService {
	MemberDao memberDao;

	MemberService(MemberDao articleDao) {
		this.memberDao = articleDao;
	}

	boolean checkId(String id) {
		if (isUsedId(id)) {
			return true;
		}
		return false;
	}

	boolean isUsedId(String id) { // true = 가입된 아이디, false = 가입되지 않은 아이디.
		return memberDao.isUsedId(id);
	}

	public void login(String id, String pw) {
		memberDao.login(id, pw);
	}

	public void join(String id, String pw, String nickName) {
		memberDao.join(id, pw, nickName);

	}

}

class MemberDao {
	DB db;
	Member[] members;
	int lastMemberIndex;
	int lastMemberOwnId;

	MemberDao(DB db) {
		this.db = db;

		members = db.getMembersFromFiles();

		for (int i = 0; i < members.length; i++) {
			if (members[i] == null) {
				lastMemberIndex = i - 1;
				break;
			}
		}

		lastMemberOwnId = db.getLastMemberOwnId();
	}

	boolean isUsedId(String id) {//멤버가 널일때 false = 사용된 아이디가 아니다.
		Member member = db.getMemberById(id);
		if (member == null) {
			return false;
		}
		return true;
	}

	public void login(String id, String pw) {
		Member loggingInMember = new Member();
		
		Member m = 
		
	}

	public void join(String id, String pw, String nickName) {
		int ownId = lastMemberOwnId + 1;
		String regDate = Util.getNowDateStr();
		Member member = new Member(id, pw, nickName, regDate, ownId);
		lastMemberIndex++;
		members[lastMemberIndex] = member;

		String memberFilePath = "member/" + member.ownId + ".txt";
		db.writeMemberJsonFile(memberFilePath, member);

		lastMemberOwnId++;
		db.updateLastMemberOwnId(lastMemberOwnId);
	}

}

class Member {
	public String id;
	public String pw;
	public String nickName;
	public int ownId;
	public String regDate;

	public Member() {

	}

	public Member(String id, String pw, String nickName, String regDate, int ownId) {
		this.id = id;
		this.pw = pw;
		this.nickName = nickName;
		this.regDate = regDate;
		this.ownId = ownId;
	}

	@Override
	public String toString() {
		return String.format("Member [id=%s, pw=%s, nickName=%s, ownId=%s, regDate=%s]", id, pw, nickName, ownId,
				regDate);
	}

}

class DB {
	Global global;

	void init() {// 일치
		loadGlobal();
	}

	Member getMemberById(String id) {
		List<Member> members = getMembers();

		for (Member member : members) {
			if (member.id.equals(id)) {
				return member;
			}
		}

		return null;
	}

	List<Member> getMembers() {
		List<Member> members = new ArrayList<>();
		int lastId = getLastMemberOwnId();

		for (int i = 1; i <= lastId; i++) {
			String filePath = "member/" + i + ".txt";
			Member member = readMemberFromJsonFile(filePath);
			if (member != null) {
				members.add(member);
			}
		}
		return members;
	}

	public void loadGlobal() {// 일치
		global = readGlobalFromJsonFile("global.txt");
	}

	Global readGlobalFromJsonFile(String filePath) {// 일치
		ObjectMapper om = new ObjectMapper();
		Global global = null;

		try {
			global = om.readValue(new File(filePath), Global.class);
		} catch (JsonParseException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			global = new Global();
			writeGlobalJsonFile(filePath, global);
		}
		return global;
	}

	void writeGlobalJsonFile(String filePath, Global global) {// 일치

		ObjectMapper om = new ObjectMapper();

		try {
			om.writeValue(new File(filePath), global);
		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void updateLastMemberOwnId(int lastMemberOwnId) {// 일치
		global.lastMemberOwnId = lastMemberOwnId;

		writeGlobalJsonFile("global.txt", global);

	}

	void writeMemberJsonFile(String filePath, Member member) {// 일치
		String folderPath = "member";// 멤버폴더 먼저 만들기
		File Folder = new File(folderPath);

		if (!Folder.exists()) {
			Folder.mkdir();
		}

		ObjectMapper om = new ObjectMapper();
		try {
			om.writeValue(new File(filePath), member);
		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public int getLastMemberOwnId() {// 일치
		return global.lastMemberOwnId;
	}

	Member[] getMembersFromFiles() {// 일치
		Member[] members = new Member[100];

		int lastMemberOwnId = getLastMemberOwnId();

		int membersIndex = 0;
		for (int i = 1; i <= lastMemberOwnId; i++) {
			String fileName = "member/" + i + ".txt";
			Member member = readMemberFromJsonFile(fileName);

			if (member != null) {
				members[membersIndex] = member;
				membersIndex++;
			}
		}
		return members;
	}

	Member readMemberFromJsonFile(String filePath) {// 일치
		ObjectMapper om = new ObjectMapper();
		Member member = null;

		try {
			member = om.readValue(new File(filePath), Member.class);
		} catch (JsonParseException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {

		} catch (IOException e) {
			e.printStackTrace();
		}
		return member;
	}

}

class Util {

	static String getNowDateStr() {
		Calendar cal = Calendar.getInstance();
		SimpleDateFormat Date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dateStr = Date.format(cal.getTime());

		return dateStr;
	}

}

class Global {
	public int lastMemberOwnId;

	Global() {
		lastMemberOwnId = 0;
	}
}