package CHAPTER07;

import java.util.List; // List 컬렉션을 사용하기 위한 import

// 추상 클래스: 요리 레시피의 기본 구조 정의
abstract class Recipe {
    protected String name; // 요리 이름 (예: "채식 카레")
    protected List<String> ingredients; // 재료 목록 (예: ["감자", "당근", "양파", "카레 가루"])

    // 생성자: 요리의 이름과 재료 목록을 초기화
    public Recipe(String name, List<String> ingredients) {
        this.name = name;
        this.ingredients = ingredients;
    }

    // 레시피 준비 방법 (추상 메서드, 각 요리 클래스에서 반드시 구현해야 함)
    public abstract void prepare();

    // 레시피 정보 출력 메서드
    public void displayRecipe() {
        System.out.println("요리: " + name); // 요리 이름 출력
        System.out.println("재료: " + String.join(", ", ingredients)); // 재료 목록 출력
    }
}

// 인터페이스: 짭짤한(Savory) 요리를 위한 인터페이스
interface SavoryDish {
    void serveWithSideDish(); // 사이드 디시 제공 메서드 (예: 샐러드, 감자튀김)
}

// 인터페이스: 달콤한(Sweet) 요리를 위한 인터페이스
interface SweetDish {
    void addSugar(); // 달콤한 맛을 추가하는 메서드
}

// 채식 요리 클래스 (VegetarianRecipe)
// Recipe 추상 클래스를 상속하고, SavoryDish 인터페이스를 구현
class VegetarianRecipe extends Recipe implements SavoryDish {
    // 생성자: 요리 이름과 재료 목록을 전달받아 부모 클래스의 생성자를 호출
    public VegetarianRecipe(String name, List<String> ingredients) {
        super(name, ingredients);
    }

    // 채식 요리 준비 과정 구현
    @Override
    public void prepare() {
        System.out.println(name + "을(를) 준비하는 중..."); // 채식 요리 준비 메시지 출력
    }

    // 사이드 디시 제공 (샐러드 등)
    @Override
    public void serveWithSideDish() {
        System.out.println(name + "은(는) 신선한 샐러드와 함께 제공할 수 있습니다.");
    }
}

// 육류 요리 클래스 (NonVegetarianRecipe)
// Recipe 추상 클래스를 상속하고, SavoryDish 인터페이스를 구현
class NonVegetarianRecipe extends Recipe implements SavoryDish {
    // 생성자: 요리 이름과 재료 목록을 전달받아 부모 클래스의 생성자를 호출
    public NonVegetarianRecipe(String name, List<String> ingredients) {
        super(name, ingredients);
    }

    // 육류 요리 준비 과정 구현
    @Override
    public void prepare() {
        System.out.println(name + "을(를) 준비하는 중... "); // 육류 요리 준비 메시지 출력
    }

    // 사이드 디시 제공 (밥, 감자튀김 등)
    @Override
    public void serveWithSideDish() {
        System.out.println(name + "은(는) 밥 또는 감자튀김과 함께 제공할 수 있습니다. ");
    }
}

// 디저트 클래스 (Dessert)
// Recipe 추상 클래스를 상속하고, SweetDish 인터페이스를 구현
class Dessert extends Recipe implements SweetDish {
    // 생성자: 요리 이름과 재료 목록을 전달받아 부모 클래스의 생성자를 호출
    public Dessert(String name, List<String> ingredients) {
        super(name, ingredients);
    }

    // 디저트 준비 과정 구현
    @Override
    public void prepare() {
        System.out.println(name + "을(를) 굽거나 냉장 보관하여 준비합니다."); // 디저트 준비 메시지 출력
    }

    // 설탕 추가 (달콤한 맛 추가)
    @Override
    public void addSugar() {
        System.out.println(name + "에 달콤한 설탕을 추가합니다.");
    }
}

public class LAB_03_RecipeSystem {
    public static void main(String[] args) {
        // 채식 요리 객체 생성 및 실행
        Recipe vegCurry = new VegetarianRecipe("채식 카레", List.of("감자", "당근", "양파", "카레 가루"));
        vegCurry.displayRecipe(); // 요리 정보 출력
        vegCurry.prepare(); // 요리 준비
        ((SavoryDish) vegCurry).serveWithSideDish(); // 다운캐스팅을 이용하여 SavoryDish 인터페이스 메서드 호출

        System.out.println(); // 줄 바꿈

        // 육류 요리 객체 생성 및 실행
        Recipe chickenStew = new NonVegetarianRecipe("치킨 스튜", List.of("닭고기", "감자", "당근", "양파", "토마토"));
        chickenStew.displayRecipe(); // 요리 정보 출력
        chickenStew.prepare(); // 요리 준비
        ((SavoryDish) chickenStew).serveWithSideDish(); // 다운캐스팅을 이용하여 SavoryDish 인터페이스 메서드 호출

        System.out.println(); // 줄 바꿈

        // 디저트 객체 생성 및 실행
        Recipe chocolateCake = new Dessert("초콜릿 케이크", List.of("밀가루", "코코아 가루", "설탕", "달걀", "버터"));
        chocolateCake.displayRecipe(); // 요리 정보 출력
        chocolateCake.prepare(); // 요리 준비
        ((SweetDish) chocolateCake).addSugar(); // 다운캐스팅을 이용하여 SweetDish 인터페이스 메서드 호출

        System.out.println("\n 레시피 관리 시스템 종료."); // 프로그램 종료 메시지 출력
    }
}
