package CHAPTER09;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Drink<T> {  // 음료 기본 클래스
    private String name;  
    private double price;
    private T customOption;

    public Drink(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public T getCustomOption() {
        return customOption;
    }

    public void setCustomOption(T customOption) {
        this.customOption = customOption;
    }
}

class CustomDrink<T> extends Drink<T> {  // 커스텀 음료 클래스
    public CustomDrink(String name, double price) {
        super(name, price);
    }

    public void addCustomOption(T option) {
        setCustomOption(option);
        System.out.println(option + "을(를) 추가했습니다.");
    }
}

class Barista {  // 음료 제조 유틸리티
    public static <T> void prepareDrink(Drink<T> drink) {
        System.out.println("컵을 준비합니다...");
        switch (drink.getName()) {
            case "아메리카노":
                System.out.println("에스프레소를 추출합니다...");
                break;
            case "카페모카":
                System.out.println("에스프레소를 추출합니다...");
                System.out.println("초콜릿 시럽을 추가합니다...");
                System.out.println("스팀밀크로 거품을 내고 덮습니다...");
                break;
            case "레몬에이드":
                System.out.println("레몬 시럽과 탄산수를 섞습니다...");
                break;
            default:
                System.out.println("알 수 없는 음료입니다...");
        }
        System.out.println(drink.getName() + "가 완성되었습니다!");
    }
}

public class RealCoffeeShopSimulation {   // 커피 전문점 실행
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 메뉴 생성
        List<Drink<?>> menu = new ArrayList<>();
        menu.add(new Drink<>("아메리카노", 4000));
        menu.add(new Drink<>("카페모카", 4500));
        menu.add(new Drink<>("레몬에이드", 5000));

        // 메뉴 표시
        System.out.println("[메뉴]");
        for (int i = 0; i < menu.size(); i++) {
            System.out.println((i + 1) + ". " + menu.get(i).getName());
        }

        // 사용자 음료 선택
        System.out.print("메뉴를 선택하세요: ");
        int choice = scanner.nextInt();
        if (choice < 1 || choice > menu.size()) {
            System.out.println("잘못된 선택입니다. 프로그램을 종료합니다.");
            return;
        }
        Drink<?> selectedDrink = menu.get(choice - 1);
        CustomDrink<String> customerOrder = 
        		new CustomDrink<>(selectedDrink.getName(), selectedDrink.getPrice());

        // 음료 제조
        System.out.println("\n[음료 제조]");
        Barista.prepareDrink(customerOrder);

        // 시럽 추가 여부 확인
        System.out.print("\n음료에 시럽을 추가하시겠습니까? (y/n): ");
        char addSyrup = scanner.next().toLowerCase().charAt(0);

        if (addSyrup == 'y') {
            System.out.println("어떤 시럽을 추가하시겠습니까?");
            System.out.println("1. 설탕\n2. 초콜릿\n3. 레몬");
            System.out.print("시럽 선택 (1/2/3): ");
            int syrupChoice = scanner.nextInt();

            String syrup = switch (syrupChoice) {
                case 1 -> "설탕 시럽";
                case 2 -> "초콜릿 시럽";
                case 3 -> "레몬 시럽";
                default -> null;
            };

            if (syrup != null) {
                customerOrder.addCustomOption(syrup);
                System.out.println(syrup + "을 추가했습니다. 즐겨드세요!");
            } else {
                System.out.println("잘못된 선택입니다. 시럽 추가 없이 종료합니다.");
            }
        } else {
            System.out.println("시럽 추가 없이 음료를 제공합니다. 즐겨드세요!");
        }
        scanner.close();
    }
}