package cn.bunny.pattern12;

import lombok.Data;
import lombok.Getter;

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

public class Memo {
    public static void main(String[] args) {
        // 定义记事本
        NoteEditText noteEditText = new NoteEditText();

        // 负责管理记事本
        NoteCaretaker noteCaretaker = new NoteCaretaker();

        // 写入记录
        noteEditText.content = "创建第一条记录。。。";
        noteCaretaker.saveMemo(noteEditText.createMemo());

        // 再次写入
        noteEditText.content = "第三条记录。。。";
        noteCaretaker.saveMemo(noteEditText.createMemo());

        // 写错撤销下
        noteEditText.restoreMemo(noteCaretaker.getPrevMemo());
    }

    // 备忘录角色-备忘录
    @Getter
    static class Memento {
        private final String content;

        public Memento(String content) {
            this.content = content;
        }
    }

    // 存储备忘录--管理者
    static class NoteCaretaker {
        private final List<Memento> mementoList = new ArrayList<>();

        // 存档位置
        private int index = 0;

        /**
         * 添加内容到备忘录中
         *
         * @param memento 备忘录
         */
        public void saveMemo(Memento memento) {
            mementoList.add(memento);
            index = mementoList.size() - 1;
            for (Memento memento1 : mementoList) {
                System.out.print(memento1.content + "  ");
            }
            System.out.println();
        }

        /**
         * 获取下一个
         *
         * @return 备忘录
         */
        public Memento getNextMemo() {
            index = index > (mementoList.size() - 1) ? index : mementoList.size() - 1;
            return mementoList.get(index);
        }

        /**
         * 获取上一个
         *
         * @return 备忘录
         */
        public Memento getPrevMemo() {
            index = index > 0 ? (index - 1) : 0;
            return mementoList.get(index);
        }
    }

    // 负责创建备忘录-发起人
    @Data
    static class NoteEditText {
        private String content;

        public Memento createMemo() {
            return new Memento(content);
        }

        public void restoreMemo(Memento memento) {
            this.content = memento.content;
            System.out.println("撤销记录：" + content);
        }
    }
}
