#!/bin/bash

#######################################
# CentOS 초기 설정 스크립트
# 사용법: ./setup_centos.sh
#######################################

set -e  # 에러 발생 시 스크립트 중단

# 색상 정의
CYAN='\033[0;36m'
BLUE='\033[1;94m'  # 밝은 파란색
PURPLE='\033[0;35m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# 로고 출력
clear
echo -e "${CYAN}"
cat << "EOF"

░█▀█░█░░░█▀█░▀█▀░█░█░░░█░█░█▀█░█░█░█▀▀░█▀▀
░█▀▀░█░░░█▀█░░█░░░█░░░░█▀█░█░█░█░█░▀▀█░█▀▀
░▀░░░▀▀▀░▀░▀░░▀░░░▀░░░░▀░▀░▀▀▀░▀▀▀░▀▀▀░▀▀▀
EOF
echo -e "${NC}"
echo -e "${PURPLE}═══════════════════════════════════════════════════════════${NC}"
echo ""
echo -e "${BLUE} CentOS 설정 스크립트 v1.0 (pty_setup_centos.sh)${NC}"
echo ""
echo -e "${BLUE} Copyright (C) 2025 by cpueblo@platyhouse.com, PlatyHouse Co.,LTD.${NC}"
echo -e "${BLUE} Visit https://www.platyhouse.com${NC}"
echo ""
#echo -e "${PURPLE}═══════════════════════════════════════════════════════════${NC}"
#echo ""

# 메뉴 출력 함수
show_menu() {
    #echo -e "${PURPLE}═══════════════════════════════════════════════════════════${NC}"
    #echo -e "${BLUE}          설치할 항목을 선택하세요${NC}"
    echo -e "${PURPLE}═══════════════════════════════════════════════════════════${NC}"
    echo ""
    echo -e "  ${CYAN}0.${NC} 전체 설치"
    echo -e "  ${CYAN}1.${NC} 호스트명 설정"
    echo -e "  ${CYAN}2.${NC} 네트워크 IP 설정"
    echo -e "  ${CYAN}3.${NC} /etc/bashrc 설정"
    echo -e "  ${CYAN}4.${NC} YUM 캐시 정리"
    echo -e "  ${CYAN}5.${NC} 시스템 패키지 업데이트"
    echo -e "  ${CYAN}6.${NC} Python 설치"
    echo -e "  ${CYAN}g.${NC} Git 작업"
    echo -e "  ${CYAN}7.${NC} Node.js 및 Claude & Gemini CLI 설치"
    echo -e "  ${CYAN}8.${NC} 필수 패키지 설치"
    echo -e "  ${CYAN}9.${NC} 시간대를 서울로 설정"
    echo -e "  ${CYAN}10.${NC} 시간 서버를 time.bora.net으로 설정"
    echo -e "  ${CYAN}11.${NC} SELinux ON/OFF"
    echo -e "  ${CYAN}q.${NC} 종료"
    echo ""
    echo -e "${YELLOW}선택 (예: 0,1,3,g 또는 0):${NC} \c"
}

#######################################
# 1. 호스트명 설정
#######################################
setup_hostname() {
    CURRENT_HOSTNAME=$(hostnamectl --static)
    echo -e "${CYAN}[1/11]${NC} 호스트명 설정, 현재 호스트명: ${YELLOW}${CURRENT_HOSTNAME}${NC}"
    echo -e "${YELLOW}호스트명을 변경하시겠습니까? (y/N):${NC} \c"
    read -n 1 -r REPLY_HOSTNAME
    echo
    if [[ $REPLY_HOSTNAME =~ ^[Yy]$ ]]; then
        echo -e "${YELLOW}설정할 호스트명을 입력하세요:${NC} \c"
        read HOSTNAME
        if [ -n "$HOSTNAME" ]; then
            hostnamectl set-hostname "$HOSTNAME"
            echo -e "  ${GREEN}✓${NC} 호스트명이 설정되었습니다: ${YELLOW}$(hostnamectl --static)${NC}"
        else
            echo -e "  ${YELLOW}⊘${NC} 호스트명이 입력되지 않아 건너뜁니다."
        fi
    else
        echo -e "  ${YELLOW}⊘${NC} 호스트명 설정을 건너뜁니다."
    fi
    echo ""
}

#######################################
# 2. 네트워크 IP 설정
#######################################
setup_network() {
    echo -e "${CYAN}[2/11]${NC} 네트워크 IP 설정"
    echo -e "${YELLOW}네트워크 IP를 설정하시겠습니까? (y/N):${NC} \c"
    read -n 1 -r REPLY_IP
    echo
    if [[ $REPLY_IP =~ ^[Yy]$ ]]; then
        # 네트워크 인터페이스 목록 표시
        echo -e "  ${BLUE}사용 가능한 네트워크 인터페이스:${NC}"
        ip -br link show | grep -v "lo" | awk '{print "    - "$1}'
        echo ""

        echo -e "${YELLOW}네트워크 인터페이스 이름 (예: eth0, ens33):${NC} \c"
        read IFACE
        echo -e "${YELLOW}IP 주소 (예: 192.168.1.100):${NC} \c"
        read IPADDR
        echo -e "${YELLOW}서브넷 마스크 (예: 255.255.255.0):${NC} \c"
        read NETMASK
        echo -e "${YELLOW}게이트웨이 (예: 192.168.1.1):${NC} \c"
        read GATEWAY
        echo -e "${YELLOW}DNS 서버 (예: 8.8.8.8):${NC} \c"
        read DNS

        if [ -n "$IFACE" ] && [ -n "$IPADDR" ] && [ -n "$NETMASK" ] && [ -n "$GATEWAY" ] && [ -n "$DNS" ]; then
            # 네트워크 스크립트 파일 생성
            IFCFG_FILE="/etc/sysconfig/network-scripts/ifcfg-${IFACE}"

            # 백업 생성 (파일이 존재하는 경우)
            if [ -f "$IFCFG_FILE" ]; then
                cp "$IFCFG_FILE" "${IFCFG_FILE}.backup.$(date +%Y%m%d_%H%M%S)"
            fi

            # 네트워크 설정 파일 작성
            cat > "$IFCFG_FILE" << EOF
TYPE=Ethernet
BOOTPROTO=static
NAME=${IFACE}
DEVICE=${IFACE}
ONBOOT=yes
IPADDR=${IPADDR}
NETMASK=${NETMASK}
GATEWAY=${GATEWAY}
DNS1=${DNS}
EOF

            # 네트워크 재시작
            echo -e "  ${BLUE}→${NC} 네트워크 재시작 중..."
            systemctl restart NetworkManager > /dev/null 2>&1

            echo -e "  ${GREEN}✓${NC} 네트워크 설정이 완료되었습니다."
            echo -e "    IP: ${YELLOW}${IPADDR}${NC}"
            echo -e "    Netmask: ${YELLOW}${NETMASK}${NC}"
            echo -e "    Gateway: ${YELLOW}${GATEWAY}${NC}"
            echo -e "    DNS: ${YELLOW}${DNS}${NC}"
        else
            echo -e "  ${YELLOW}⊘${NC} 필수 정보가 입력되지 않아 건너뜁니다."
        fi
    else
        echo -e "  ${YELLOW}⊘${NC} 네트워크 IP 설정을 건너뜁니다."
    fi
    echo ""
}

#######################################
# 3. /etc/bashrc 설정
#######################################
setup_bashrc() {
    SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
    bash $SCRIPT_DIR/ptySetBash
}

#######################################
# 4. YUM 캐시 정리
#######################################
setup_yum_clean() {
    echo -e "${CYAN}[4/11]${NC} YUM 캐시 정리"
    echo -e "${YELLOW}YUM 캐시를 정리하시겠습니까? (y/N):${NC} \c"
    read -n 1 -r REPLY_YUM_CLEAN
    echo
    if [[ $REPLY_YUM_CLEAN =~ ^[Yy]$ ]]; then
        yum clean all > /dev/null 2>&1
        rm -rf /var/cache/yum
        echo -e "  ${GREEN}✓${NC} YUM 캐시가 정리되었습니다."
    else
        echo -e "  ${YELLOW}⊘${NC} YUM 캐시 정리를 건너뜁니다."
    fi
    echo ""
}

#######################################
# 5. 시스템 업데이트
#######################################
setup_system_update() {
    echo -e "${CYAN}[5/11]${NC} 시스템 패키지 업데이트"
    echo -e "${YELLOW}시스템 업데이트를 진행하시겠습니까? (y/N):${NC} \c"
    read -n 1 -r REPLY_UPDATE
    echo
    if [[ $REPLY_UPDATE =~ ^[Yy]$ ]]; then
        yum update -y
        echo -e "  ${GREEN}✓${NC} 시스템 업데이트가 완료되었습니다."
    else
        echo -e "  ${YELLOW}⊘${NC} 시스템 업데이트를 건너뜁니다."
    fi
    echo ""
}

#######################################
# 6. Python 설치
#######################################
setup_python() {
    echo -e "${CYAN}[6/11]${NC} Python 설치"
    echo -e "${YELLOW}Python을 설치하시겠습니까? (y/N):${NC} \c"
    read -n 1 -r REPLY_PYTHON
    echo
    if [[ $REPLY_PYTHON =~ ^[Yy]$ ]]; then
        echo -e "  ${BLUE}→${NC} Python 설치 중..."
        yum install -y python3 python3-pip > /dev/null 2>&1
        echo -e "  ${GREEN}✓${NC} Python 설치 완료: $(python3 --version)"
    else
        echo -e "  ${YELLOW}⊘${NC} Python 설치를 건너뜁니다."
    fi
    echo ""
}


#######################################
# g. Git 작업
#######################################
setup_git() {
    echo -e "${CYAN}[g]${NC} Git 작업 2"
    echo ""
    # pty_git 실행
    if [ -f "/var/lib/pty_centos.git/pty_git" ]; then
        bash /var/lib/pty_centos.git/pty_git
    elif [ -f "./pty_git" ]; then
        bash ./pty_git
    else
        echo -e "  ${RED}✗${NC} pty_git 파일을 찾을 수 없습니다."
        echo -e "  ${YELLOW}경로:${NC} /var/lib/pty_centos.git/pty_git 또는 ./pty_git"
    fi
    echo ""
}

#######################################
# 7. Node.js 및 Claude 설치
#######################################
setup_nodejs_claude() {
    echo -e "${CYAN}[7/11]${NC} Node.js 및 Claude & Gemini CLI 설치"
    echo -e "${YELLOW}Node.js와 Claude, Gemini CLI를 설치하시겠습니까? (y/N):${NC} \c"
    read -n 1 -r REPLY_CLAUDE
    echo
    if [[ $REPLY_CLAUDE =~ ^[Yy]$ ]]; then
        # Node.js 설치
        echo -e "  ${BLUE}→${NC} Node.js 설치 중..."
        curl -fsSL https://rpm.nodesource.com/setup_lts.x | bash - > /dev/null 2>&1
        yum install -y nodejs > /dev/null 2>&1
        echo -e "  ${GREEN}✓${NC} Node.js 설치 완료: $(node --version)"

        # Claude 설치
        echo -e "  ${BLUE}→${NC} Claude 설치 중..."
        if npm install -g @anthropic-ai/claude-code > /dev/null 2>&1; then
            echo -e "  ${GREEN}✓${NC} Claude 설치가 완료되었습니다."
        else
            echo -e "  ${RED}✗${NC} Claude 설치에 실패했습니다. Gemini CLI 설치로 넘어갑니다."
        fi

        # Gemini CLI 설치
        echo -e "  ${BLUE}→${NC} Gemini CLI 설치 중..."
        if npm install -g @google/gemini-cli > /dev/null 2>&1; then
            echo -e "  ${GREEN}✓${NC} Gemini CLI 설치가 완료되었습니다."
        else
            echo -e "  ${RED}✗${NC} Gemini CLI 설치에 실패했습니다."
        fi
    else
        echo -e "  ${YELLOW}⊘${NC} Node.js 및 CLI 설치를 건너뜁니다."
    fi
    echo ""
}

#######################################
# 8. 필수 패키지 설치
#######################################
setup_packages() {
    echo -e "${CYAN}[8/11]${NC} 필수 패키지 설치"
    echo -e "${YELLOW}필수 패키지를 설치하시겠습니까? (vim, wget, curl, net-tools 등) (y/N):${NC} \c"
    read -n 1 -r REPLY_PACKAGES
    echo
    if [[ $REPLY_PACKAGES =~ ^[Yy]$ ]]; then
        yum install -y \
            vim \
            wget \
            curl \
            net-tools \
            bind-utils \
            telnet \
            tcpdump > /dev/null 2>&1

        echo -e "  ${GREEN}✓${NC} 필수 패키지 설치가 완료되었습니다."

        # tmux 설치 여부 확인
        echo ""
        echo -e "  ${YELLOW}tmux를 설치하시겠습니까? (y/N):${NC} \c"
        read -n 1 -r REPLY_TMUX
        echo
        if [[ $REPLY_TMUX =~ ^[Yy]$ ]]; then
            echo -e "  ${BLUE}→${NC} tmux 설치 중..."
            yum install -y tmux > /dev/null 2>&1
            echo -e "  ${GREEN}✓${NC} tmux 설치가 완료되었습니다."
        fi
    else
        echo -e "  ${YELLOW}⊘${NC} 필수 패키지 설치를 건너뜁니다."
    fi
    echo ""
}

#######################################
# 9. 시간대 설정
#######################################
setup_timezone() {
    echo -e "${CYAN}[9/11]${NC} 시간대를 서울로 설정"
    echo -e "${YELLOW}시간대를 Asia/Seoul로 설정하시겠습니까? (y/N):${NC} \c"
    read -n 1 -r REPLY_TIMEZONE
    echo
    if [[ $REPLY_TIMEZONE =~ ^[Yy]$ ]]; then
        timedatectl set-timezone Asia/Seoul
        echo -e "  ${GREEN}✓${NC} 시간대가 Asia/Seoul로 설정되었습니다."
        echo -e "  현재 시간: ${YELLOW}$(date '+%Y-%m-%d %H:%M:%S %Z')${NC}"
    else
        echo -e "  ${YELLOW}⊘${NC} 시간대 설정을 건너뜁니다."
    fi
    echo ""
}

#######################################
# 10. 시간 서버 설정
#######################################
setup_timeserver() {
    echo -e "${CYAN}[10/11]${NC} 시간 서버를 time.bora.net으로 설정"
    echo -e "${YELLOW}시간 서버를 time.bora.net으로 설정하시겠습니까? (y/N):${NC} \c"
    read -n 1 -r REPLY_TIMESERVER
    echo
    if [[ $REPLY_TIMESERVER =~ ^[Yy]$ ]]; then
        echo -e "  ${BLUE}→${NC} chrony 패키지 설치 중..."
        dnf install chrony -y > /dev/null 2>&1

        echo -e "  ${BLUE}→${NC} chronyd 서비스 활성화 중..."
        systemctl enable --now chronyd > /dev/null 2>&1

        echo -e "  ${BLUE}→${NC} time.bora.net 서버 추가 중..."
        echo "server time.bora.net iburst" | tee -a /etc/chrony.conf > /dev/null

        echo -e "  ${BLUE}→${NC} chronyd 재시작 중..."
        systemctl restart chronyd > /dev/null 2>&1

        echo -e "  ${GREEN}✓${NC} 시간 서버 설정이 완료되었습니다."
        echo -e "  ${BLUE}시간 동기화 소스:${NC}"
        chronyc sources -v
    else
        echo -e "  ${YELLOW}⊘${NC} 시간 서버 설정을 건너뜁니다."
    fi
    echo ""
}

#######################################
# 11. SELinux ON/OFF 설정
#######################################
setup_selinux() {
    echo -e "${CYAN}[11/11]${NC} SELinux ON/OFF 설정"

    # 현재 SELinux 상태 확인
    CURRENT_SELINUX=$(getenforce 2>/dev/null || echo "Unknown")
    echo -e "  현재 SELinux 상태: ${YELLOW}${CURRENT_SELINUX}${NC}"
    echo ""

    echo -e "${YELLOW}SELinux를 어떻게 설정하시겠습니까?${NC}"
    echo -e "  ${CYAN}1.${NC} SELinux 비활성화 (Disabled)"
    echo -e "  ${CYAN}2.${NC} SELinux 활성화 (Enforcing)"
    echo -e "  ${CYAN}3.${NC} 건너뛰기"
    echo -e "${YELLOW}선택 (1/2/3):${NC} \c"
    read -n 1 -r REPLY_SELINUX
    echo
    echo

    case $REPLY_SELINUX in
        1)
            echo -e "  ${BLUE}→${NC} SELinux를 비활성화합니다..."
            sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
            sed -i 's/SELINUX=permissive/SELINUX=disabled/g' /etc/selinux/config
            setenforce 0 2>/dev/null
            echo -e "  ${GREEN}✓${NC} SELinux가 비활성화되었습니다."
            echo -e "  ${YELLOW}[참고]${NC} 재부팅 후 완전히 적용됩니다."
            ;;
        2)
            echo -e "  ${BLUE}→${NC} SELinux를 활성화합니다..."
            sed -i 's/SELINUX=disabled/SELINUX=enforcing/g' /etc/selinux/config
            sed -i 's/SELINUX=permissive/SELINUX=enforcing/g' /etc/selinux/config
            echo -e "  ${GREEN}✓${NC} SELinux가 활성화로 설정되었습니다."
            echo -e "  ${YELLOW}[참고]${NC} 재부팅 후 완전히 적용됩니다."
            ;;
        3)
            echo -e "  ${YELLOW}⊘${NC} SELinux 설정을 건너뜁니다."
            ;;
        *)
            echo -e "  ${RED}잘못된 선택입니다.${NC}"
            ;;
    esac
    echo ""
}

#######################################
# 메인 실행 로직
#######################################

# 메뉴 반복
while true; do
    # 메뉴 표시
    show_menu

    # 사용자 입력 받기
    read MENU_CHOICE

    # 입력값 처리 (쉼표로 구분된 값을 배열로 변환)
    IFS=',' read -ra CHOICES <<< "$MENU_CHOICE"

    echo ""

    # 종료 체크
    if [[ "$MENU_CHOICE" == "q" ]] || [[ "$MENU_CHOICE" == "Q" ]]; then
        echo -e "${YELLOW}설치를 종료합니다.${NC}"
        break
    fi

    # 0번 선택 시 전체 설치하고 종료
    if [[ "$MENU_CHOICE" == "0" ]]; then
        echo -e "${BLUE}전체 설치를 시작합니다...${NC}"
        echo ""
        setup_hostname
        setup_network
        setup_bashrc
        setup_yum_clean
        setup_system_update
        setup_python
        setup_git
        setup_nodejs_claude
        setup_packages
        setup_timezone
        setup_timeserver
        setup_selinux
        break
    fi

    # 선택된 항목 실행
    for choice in "${CHOICES[@]}"; do
        # 공백 제거
        choice=$(echo "$choice" | xargs)

        case $choice in
            1)
                setup_hostname
                ;;
            2)
                setup_network
                ;;
            3)
                setup_bashrc
                ;;
            4)
                setup_yum_clean
                ;;
            5)
                setup_system_update
                ;;
            6)
                setup_python
                ;;
            g|G)
                setup_git
                ;;
            7)
                setup_nodejs_claude
                ;;
            8)
                setup_packages
                ;;
            9)
                setup_timezone
                ;;
            10)
                setup_timeserver
                ;;
            11)
                setup_selinux
                ;;
            *)
                echo -e "${RED}잘못된 선택: ${choice}${NC}"
                echo ""
                ;;
        esac
    done
done

#######################################
# 완료
#######################################
echo ""
echo -e "${PURPLE}═══════════════════════════════════════════════════════════${NC}"
echo -e "${GREEN}✓ CentOS 초기 설정이 완료되었습니다!${NC}"
echo -e "${PURPLE}═══════════════════════════════════════════════════════════${NC}"
echo ""
echo -e "  ${CYAN}▶${NC} 현재 호스트명: ${YELLOW}$(hostnamectl --static)${NC}"
echo ""
echo -e "${YELLOW}[알림]${NC} 변경사항 적용을 위해 다음 중 하나를 실행하세요:"
echo -e "  ${BLUE}1.${NC} 쉘 재시작"
echo -e "  ${BLUE}2.${NC} source /etc/bashrc"
echo ""
echo -e "${PURPLE}═══════════════════════════════════════════════════════════${NC}"
