#!/usr/bin/env bash
#
# /app/imm 정적 파일 웹서버 기동/중지 스크립트
#
#   ./webserv.sh start     기동
#   ./webserv.sh stop      중지
#   ./webserv.sh restart   재기동
#   ./webserv.sh status    상태 확인
#   ./webserv.sh log       로그 보기 (tail -f)
#
# 포트를 바꾸려면: PORT=9000 ./webserv.sh start
#
set -u

ROOT="${ROOT:-/app/imm}"
PORT="${PORT:-8500}"
BIND="${BIND:-0.0.0.0}"
PIDFILE="$ROOT/httpd.pid"
LOGFILE="$ROOT/httpd.log"

running_pid() {
    [ -f "$PIDFILE" ] || return 1
    local pid
    pid=$(cat "$PIDFILE" 2>/dev/null)
    [ -n "$pid" ] || return 1
    # 해당 PID가 살아있고 실제로 우리 http.server인지 확인
    grep -qa "http.server" "/proc/$pid/cmdline" 2>/dev/null || return 1
    echo "$pid"
}

host_ip() {
    hostname -I 2>/dev/null | awk '{print $1}'
}

start() {
    local pid
    if pid=$(running_pid); then
        echo "이미 기동 중입니다 (PID $pid, 포트 $PORT)"
        return 0
    fi

    if ss -ltn "sport = :$PORT" 2>/dev/null | grep -q LISTEN; then
        echo "오류: 포트 $PORT 를 다른 프로세스가 사용 중입니다." >&2
        return 1
    fi

    setsid nohup python3 -m http.server "$PORT" \
        --bind "$BIND" --directory "$ROOT" \
        >"$LOGFILE" 2>&1 </dev/null &
    local newpid=$!
    echo "$newpid" >"$PIDFILE"

    sleep 1
    if ! running_pid >/dev/null; then
        echo "기동 실패. 로그를 확인하세요: $LOGFILE" >&2
        rm -f "$PIDFILE"
        return 1
    fi

    echo "기동 완료 (PID $newpid)"
    echo "  로컬     : http://localhost:$PORT/"
    local ip
    ip=$(host_ip)
    [ -n "$ip" ] && echo "  네트워크 : http://$ip:$PORT/"
    echo "  문서루트 : $ROOT"
    echo "  로그     : $LOGFILE"
}

stop() {
    local pid
    if ! pid=$(running_pid); then
        # pidfile 이 없거나 죽은 경우, 포트로 한 번 더 찾아본다
        pid=$(pgrep -f "http.server $PORT" | head -1)
        if [ -z "$pid" ]; then
            echo "기동 중이 아닙니다."
            rm -f "$PIDFILE"
            return 0
        fi
    fi

    kill "$pid" 2>/dev/null
    for _ in $(seq 1 10); do
        kill -0 "$pid" 2>/dev/null || break
        sleep 0.3
    done
    if kill -0 "$pid" 2>/dev/null; then
        echo "정상 종료되지 않아 강제 종료합니다 (PID $pid)"
        kill -9 "$pid" 2>/dev/null
    fi

    rm -f "$PIDFILE"
    echo "중지 완료 (PID $pid)"
}

status() {
    local pid
    if pid=$(running_pid); then
        echo "실행 중 (PID $pid, 포트 $PORT, 문서루트 $ROOT)"
        local code
        code=$(curl -s -o /dev/null -w '%{http_code}' "http://127.0.0.1:$PORT/" 2>/dev/null)
        echo "  응답 확인: HTTP ${code:-무응답}"
        return 0
    fi
    echo "중지됨"
    return 1
}

case "${1:-}" in
    start)   start ;;
    stop)    stop ;;
    restart) stop; echo; start ;;
    status)  status ;;
    log)     tail -f "$LOGFILE" ;;
    *)
        echo "사용법: $0 {start|stop|restart|status|log}" >&2
        exit 1
        ;;
esac
