package CHAP16;

import java.sql.*;
import java.util.Scanner;

public class LAB01_ConsoleUserRegistration {
	private static final String DB_URL = "jdbc:mysql://localhost:3306/";
	private static final String DB_USER = "root"; // MySQL 사용자명
	private static final String DB_PASSWORD = "123456789"; // MySQL 비밀번호
	private static final String DATABASE_NAME = "course";

	public static void main(String[] args) {
		// 데이터베이스 및 테이블 자동 생성
		initializeDatabase();
		Scanner scanner = new Scanner(System.in);
		while (true) {
			System.out.println("\n===== 회원 관리 시스템 =====");
			System.out.println("1. 회원가입");
			System.out.println("2. 로그인");
			System.out.println("3. 종료");
			System.out.print("메뉴 선택: ");

			int choice = scanner.nextInt();
			scanner.nextLine(); // 개행 문자 제거

			switch (choice) {
			case 1:
				registerUser(scanner);
				break;
			case 2:
				loginUser(scanner);
				break;
			case 3:
				System.out.println("프로그램 종료.");
				return;
			default:
				System.out.println("잘못된 입력입니다. 다시 선택하세요.");
			}
		}
	}

	// ✅ 데이터베이스 및 테이블 자동 생성
	private static void initializeDatabase() {
		try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
				Statement stmt = conn.createStatement()) {

			// 데이터베이스 생성 (존재하지 않으면)
			String createDatabase = "CREATE DATABASE IF NOT EXISTS " + DATABASE_NAME;
			stmt.executeUpdate(createDatabase);

			// DB_URL을 변경하여 생성된 데이터베이스에 연결
			try (Connection dbConn = DriverManager.getConnection(DB_URL + DATABASE_NAME, DB_USER, DB_PASSWORD);
					Statement dbStmt = dbConn.createStatement()) {

				// users 테이블 생성
				String createTable = "CREATE TABLE IF NOT EXISTS users (" + "id INT AUTO_INCREMENT PRIMARY KEY, "
						+ "username VARCHAR(50) NOT NULL UNIQUE, " + "email VARCHAR(100) NOT NULL, "
						+ "password VARCHAR(255) NOT NULL" + ")";
				dbStmt.executeUpdate(createTable);

				System.out.println("[✅ MySQL 초기화 완료] 데이터베이스 및 테이블이 준비되었습니다.");
			}
		} catch (SQLException e) {
			System.err.println("MySQL 초기화 오류: " + e.getMessage());
		}
	}

	// ✅ 회원가입 기능
	private static void registerUser(Scanner scanner) {
		System.out.println("\n[ 회원가입 ]");
		System.out.print("사용자명: ");
		String username = scanner.nextLine();
		System.out.print("이메일: ");
		String email = scanner.nextLine();
		System.out.print("비밀번호: ");
		String password = scanner.nextLine();

		String sql = "INSERT INTO users (username, email, password) VALUES (?, ?, ?)";

		try (Connection conn = DriverManager.getConnection(DB_URL + DATABASE_NAME, DB_USER, DB_PASSWORD);
				PreparedStatement pstmt = conn.prepareStatement(sql)) {

			pstmt.setString(1, username);
			pstmt.setString(2, email);
			pstmt.setString(3, password);
			int rowsInserted = pstmt.executeUpdate();

			if (rowsInserted > 0) {
				System.out.println("회원가입 성공!");
			} else {
				System.out.println("회원가입 실패.");
			}
		} catch (SQLIntegrityConstraintViolationException e) {
			System.out.println("이미 존재하는 사용자명입니다. 다시 시도하세요.");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// ✅ 로그인 기능
	private static void loginUser(Scanner scanner) {
		System.out.println("\n[ 로그인 ]");
		System.out.print("사용자명: ");
		String username = scanner.nextLine();
		System.out.print("비밀번호: ");
		String password = scanner.nextLine();

		String sql = "SELECT * FROM users WHERE username = ? AND password = ?";

		try (Connection conn = DriverManager.getConnection(DB_URL + DATABASE_NAME, DB_USER, DB_PASSWORD);
				PreparedStatement pstmt = conn.prepareStatement(sql)) {

			pstmt.setString(1, username);
			pstmt.setString(2, password);
			ResultSet rs = pstmt.executeQuery();

			if (rs.next()) {
				System.out.println("로그인 성공! 환영합니다, " + username + "님.");
			} else {
				System.out.println("로그인 실패. 사용자명 또는 비밀번호를 확인하세요.");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
