package CHAP12;

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

class User implements Serializable { // 사용자 객체 (Serializable 적용)
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    private String email;

    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    public String getName() {
        return name;
    }
    @Override
    public String toString() {
        return "이름: " + name + ", 나이: " + age + ", 이메일: " + email;
    }
}

public class REAL_UserDataSystem {
    private static final String FILE_NAME = "user.dat";
    private static List<User> userList = new ArrayList<>();
    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        loadUserData(); // 프로그램 실행 시 기존 데이터 로드

        while (true) {
            System.out.println("\n사용자 데이터 저장 시스템");
            System.out.println("1. 사용자 목록 출력");
            System.out.println("2. 사용자 추가");
            System.out.println("3. 사용자 삭제");
            System.out.println("4. 종료");
            System.out.print("선택: ");
            int choice = scanner.nextInt();
            scanner.nextLine(); // 개행 문자 처리

            switch (choice) {
                case 1 -> displayUsers();
                case 2 -> addUser();
                case 3 -> deleteUser();
                case 4 -> {
                    saveUserData(); // 종료 전에 데이터 저장
                    System.out.println("프로그램 종료");
                    return;
                }
                default -> System.out.println(" 올바른 번호를 입력하세요.");
            }
        }
    }

    // 사용자 목록 출력
    private static void displayUsers() {
        if (userList.isEmpty()) {
            System.out.println("저장된 사용자가 없습니다.");
        } else {
            System.out.println("\n사용자 목록:");
            for (User user : userList) {
                System.out.println(user);
            }
        }
    }

    //사용자 추가
    private static void addUser() {
        System.out.print("이름 입력: ");
        String name = scanner.nextLine();
        System.out.print("나이 입력: ");
        int age = scanner.nextInt();
        scanner.nextLine(); 
        System.out.print("이메일 입력: ");
        String email = scanner.nextLine();

        userList.add(new User(name, age, email));
        System.out.println("사용자 추가 완료!");
    }

    //사용자 삭제
    private static void deleteUser() {
        if (userList.isEmpty()) {
            System.out.println("삭제할 사용자가 없습니다.");
            return;
        }
        System.out.print("삭제할 사용자 이름 입력: ");
        String name = scanner.nextLine();

        Iterator<User> iterator = userList.iterator();
        boolean found = false;

        while (iterator.hasNext()) {
            User user = iterator.next();
            if (user.getName().equalsIgnoreCase(name)) {
                iterator.remove();
                System.out.println("사용자 삭제 완료!");
                found = true;
                break;
            }
        }

        if (!found) {
            System.out.println("'" + name + "' 사용자 정보를 찾을 수 없습니다.");
        }
    }

    // 데이터 저장 (ObjectOutputStream 활용)
    private static void saveUserData() {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME))) {
            oos.writeObject(userList);
            System.out.println("사용자 데이터 저장 완료.");
        } catch (IOException e) {
            System.out.println("데이터 저장 중 오류 발생: " + e.getMessage());
        }
    }

    // 데이터 로드 (ObjectInputStream 활용)
    private static void loadUserData() {
        File file = new File(FILE_NAME);
        if (!file.exists()) return;

        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME))) {
            userList = (List<User>) ois.readObject();
            System.out.println("사용자 데이터 로드 완료.");
        } catch (IOException | ClassNotFoundException e) {
            System.out.println("데이터 로드 중 오류 발생: " + e.getMessage());
        }
    }
}