// TODO : 자식 컴포넌트 ./pages/dept/Dept.js
// TODO : dept 상세조회 페이지(수정/삭제)
// TODO : import 메뉴 라이브러리
import { useParams, useNavigate } from "react-router-dom";
// TODO : import axios 공통 함수 파일
import DeptService from "../../services/DeptService";
// TODO : React 컴포넌트
import React, { useEffect, useState } from "react";
// 단축키 : rfce
function Dept() {
  // TODO : 변수 정의
  // TODO :이전 페이지에서 변수의(id) 값을(부서번호) 전송 : 받기
  const { id } = useParams(); // 전송된 값 받기 함수 호출
  let navigate = useNavigate(); // 페이지 강제 이동시키는 함수
  // TODO : 바인딩 변수
  // 임시 객체(초기화)
  const ininialDept = {
    id: "", // 부서번호
    dname: "", // 부서명
    loc: "", // 부서위치
  };
  // 바인딩 변수 사용법 : let [변수명, set변수명] = useState(초기값);
  let [dept, setDept] = useState(ininialDept); // 백엔드로 전송할 변수(insert 요청)
  let [message, setMessage] = useState(""); // 수정버튼 클릭 후 성공여부 메세지 변수
  // TODO : 함수 정의
  // TODO : 최초 화면이 뜰때 부서번호에 해당하는 데이터를 화면에 표시하는 함수
  // TODO : 백엔드에 부서번호에 해당되는 부서객체를 조회 요청(1건 리턴)
  // TODO : axios 함수 : get(`/dept/${id}`) 함수 [vs 저장요청 : post()]
  // TODO : 1건 조회 함수(상세조회 함수) 정의
  const getDept = (id) => {
    DeptService.get(id) // 상세조회 요청(id)
      .then((response) => {
        // 성공시 자동실행
        setDept(response.data); // 백엔드에서 보내준 결과 저장
        // 로그 찍기
        console.log(response.data);
      })
      .catch((e) => {
        // 실패시 자동실행
        console.log(e); // 에러메세지 출력
      });
  };
  // TODO : 화면이 뜰떄 실행되는 함수
  // TODO : 화면이 뜰떄 실행되는 함수 + id 값이 수정되었을때도 자동실행
  // 사용법(수정) : useEffect(()=>{실행문}, [감시할변수명]);
  useEffect(() => {
    if (id) {
      getDept(id); // 상세조회 함수 실행
    }
  }, [id]);
  // TODO : 역바인딩 함수 정의
  const handleInputChange = (event) => {
    let attrValue = event.target.value; // 화면 입력값
    let attrName = event.target.name; // 화면 태그 이름(===객체의 속성명)
    //스프레드 연산자로 속성의 값을 수정
    setDept({ ...dept, [attrName]: attrValue });
  };
  // TODO: 수정함수 정의 : 클릭
  // axios 공통함수 : axios.put("url/부서번호", 수정될객체)
  const updateDept = () => {
    DeptService.update(dept.id, dept) // 수정 요청(부서번호(id), 부서객체(dept))
      .then((response) => {
        // 성공시 자동실행
        // 로그 찍기
        console.log(response.data);
        // TODO : 수정 성공시 화면에 수정 성공 메세지를 출력
        setMessage("부서 수정이 성공하였습니다.");
      })
      .catch((e) => {
        // 실패시 자동실행
        console.log(e); // 에러메세지 출력
      });
  };
  // TODO : 삭제함수 정의 : 클릭
  // axios 공통함수 : axios.delete(url/부서번호(id))
  // 지정한 키워드를 주어 해당 url만 삭제시킨다. 지정 키워드를 안주면 전체 삭제가된다.
  const deleteDept = () => {
    DeptService.remove(dept.id) // 삭제 요청(id)
      .then((response) => {
        // 로그 찍기
        console.log(response.data);
        // TODO : 삭제 성공 후 자동으로 1st 페이지로 이동(전체 조회페이지)
        // 사용법 : navigate("이동될페이지주소")
        navigate("/dept"); // TODO : 강제페이지 이동 함수 실행
      })
      .catch((e) => {
        // 실패시 자동실행
        console.log(e); // 에러메세지 출력
      });
  };
  return (
    // TODO : html 정의
    <>
      {/* 제목 start */}
      <div className="row">
        {/* 제목 시작 */}
        <div className="col-md-6 mb-5 mt-5">
          <h1>Dept Detail No Page</h1>
        </div>
        {/* 제목 끝 */}
      </div>
      {/* 제목 end */}
      <>
        {dept ? (
          /* 상세화면 form 시작 */
          <div className="col-6 mx-auto">
            <form>
              {/* 부서명(dname) 시작 */}
              <div className="row g-3 align-items-center mb-3">
                <div className="col-3">
                  <label htmlFor="dname" className="col-form-label">
                    Dname
                  </label>
                </div>
                <div className="col-9">
                  <input
                    type="text"
                    id="dname"
                    required
                    className="form-control"
                    value={dept.dname}
                    onChange={handleInputChange}
                    placeholder="dname"
                    name="dname"
                  />
                </div>
              </div>
              {/* 부서명 끝 */}
              {/* 부서위치(loc) 시작 */}
              <div className="row g-3 align-items-center mb-3">
                <div className="col-3">
                  <label htmlFor="loc" className="col-form-label">
                    Loc
                  </label>
                </div>
                <div className="col-9">
                  <input
                    type="text"
                    id="loc"
                    required
                    className="form-control"
                    value={dept.loc}
                    onChange={handleInputChange}
                    placeholder="loc"
                    name="loc"
                  />
                </div>
              </div>
              {/* 부서위치(loc) 끝 */}
            </form>
            {/* 버튼 시작 : 삭제 / 수정 버튼 */}
            <div className="row g-3 mt-3 mb-3">
              <button
                onClick={deleteDept}
                className="btn btn-outline-danger ms-3 col"
              >
                Delete
              </button>
              <button
                type="submit"
                onClick={updateDept}
                className="btn btn-outline-success ms-2 col"
              >
                Update
              </button>
            </div>
            {/* 버튼 끝 : 삭제 / 수정 버튼 */}
            {/* 수정버튼을 클릭해서 성공하면 성공/실패메세지 출력 */}
            <p>{message}</p>
          </div>
        ) : (
          /* 상세화면 form 끝 */
          /* 에러시 보여줄 화면 시작 */
          <div className="col-6 mx-auto">
            <br />
            <p>Please click on a Dept...</p>
          </div>
          /* 에러시 보여줄 화면 끝 */
        )}
      </>
    </>
  );
}
export default Dept;