import React, { useState } from "react";

const App = () => {

  // 초기 데이터 객체 리스트
  const [names, setNames] = useState([
    { id: 1, text: "눈사람" },
    { id: 2, text: "얼음" },
    { id: 3, text: "눈" },
    { id: 4, text: "바람" },
  ]);

  //입력한 텍스트 state
  const [InputText, setInputText] = useState("");

  //추가 할 데이터 객체의 Id state
  const [nextId, setNextId] = useState(names.length+1); // 리스트 길이 +1로 설정

  //이벤트 객체의 입력한 텍스트 감지 함수
  const onChange = (e) => {
    setInputText(e.target.value);
  };
  // 데이터 객체 리스트를 map을 이용하여 변환 렌더링
  const nameList = names.map((name) => <li key={name.id}>{name.text}</li>);

  // 리스트에 데이터 추가 함수
  const addList = () => {
    if(InputText===''){ alert('입력하셈 ㅡㅡ'); } // 입력한 값이 없으면 경고문 출력
    else{
      // 불변성의 원칙을 지키기 위해 기존 names 리스트에 추가 할 데이터를 concat하여 새로운 리스트(nextNames)에 복사하여 setNames로 반영한다.
      const nextNames = names.concat({
          id:nextId,  // 아이디는 nextId 값
          text:InputText, // text는 입력한 값
      });
      setNextId(prev=>prev+1); //추가한 후 nextId 값 1증가
      setNames(nextNames);  // 기존 리스트(names)를 렌더링 하고 있던 것을 데이터를 추가한 리스트(nextNames)로 바꾸어 렌더링
      setInputText(''); // 입력값 초기화
    }
  } 

  // 리스트에 데이터 삭제 함수
  const removeList = () =>{
    // 불변성의 원칙을 지키기 위해 기존 names 리스트에 삭제 할 데이터를 filter하여 새로운 리스트(nextNames)에 복사하여 setNames로 반영한다.
    const nextNames = names.filter(name => InputText!==name.text); // 입력된 텍스트와 같은 데이터를 삭제한다
    setNames(nextNames); // 데이터 반영
  }

  return (
    <div>
      <input value={InputText} onChange={onChange} />
      <button onClick={addList}>추가</button>
      <button onClick={removeList}>제거</button>
      <ul>{nameList}</ul>
    </div>
  );
};

export default App;