package CHAPTER05;

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

public class 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 = "1234"; // MySQL 비밀번호
    private static final String DATABASE_NAME = "world";

    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();
        }
    }
}

