#!/bin/bash

# =============================================================================
# PRISM-INSIGHT Crontab 설정 스크립트
# =============================================================================
# 이 스크립트는 PRISM-INSIGHT 자동 실행을 위한 crontab을 설정합니다.
# 사용자 환경에 맞게 변수를 수정하여 사용하세요.
# =============================================================================

set -e  # 에러 발생 시 즉시 종료

# 색상 정의
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# =============================================================================
# 설정 변수 (사용자 환경에 맞게 수정 필요)
# =============================================================================

# 프로젝트 경로 (기본값: 현재 디렉토리)
PROJECT_DIR="${PROJECT_DIR:-$(pwd)}"

# Python 실행 파일 경로 자동 감지
detect_python_path() {
    # 우선순위: pyenv > venv > system python
    if command -v pyenv &> /dev/null && [ -d "$HOME/.pyenv" ]; then
        echo "$HOME/.pyenv/shims/python"
    elif [ -f "$PROJECT_DIR/venv/bin/python" ]; then
        echo "$PROJECT_DIR/venv/bin/python"
    elif [ -f "$PROJECT_DIR/.venv/bin/python" ]; then
        echo "$PROJECT_DIR/.venv/bin/python"
    else
        echo "$(command -v python3 || command -v python)"
    fi
}

PYTHON_PATH="${PYTHON_PATH:-$(detect_python_path)}"

# 로그 디렉토리
LOG_DIR="${LOG_DIR:-$PROJECT_DIR/logs}"

# 사용자 홈 디렉토리
USER_HOME="${HOME:-/home/$(whoami)}"

# =============================================================================
# 실행 시간 설정 (한국 시간 기준)
# =============================================================================
MORNING_BATCH_TIME="30 9"       # 오전 9시 30분
AFTERNOON_BATCH_TIME="40 15"    # 오후 3시 40분
DATA_UPDATE_TIME="0 7"          # 오전 7시
LOG_CLEANUP_TIME="0 3"          # 오전 3시
PORTFOLIO_REPORT_TIME="0 18"    # 오후 6시
CONFIG_BACKUP_TIME="0 2"        # 오전 2시 (매일)
MEMORY_COMPRESSION_TIME="0 3"   # 오전 3시 (일요일만)
PERFORMANCE_TRACKER_TIME="0 17" # 오후 5시
DASHBOARD_REFRESH_AM_TIME="5 11"  # 오전 11시 5분
DASHBOARD_REFRESH_PM_TIME="10 17" # 오후 5시 10분

# =============================================================================
# 함수 정의
# =============================================================================

# 로그 출력 함수
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_success() {
    echo -e "${GREEN}✓${NC} $1"
}

# 환경 검증 함수
validate_environment() {
    log_info "환경 검증 시작..."
    
    # 프로젝트 디렉토리 확인
    if [ ! -d "$PROJECT_DIR" ]; then
        log_error "프로젝트 디렉토리를 찾을 수 없습니다: $PROJECT_DIR"
        exit 1
    fi
    
    # Python 실행 파일 확인
    if [ ! -f "$PYTHON_PATH" ]; then
        log_error "Python 실행 파일을 찾을 수 없습니다: $PYTHON_PATH"
        log_info "PYTHON_PATH 환경 변수를 설정하거나 Python을 설치해주세요."
        exit 1
    fi
    
    # 필수 파일 확인
    local required_files=(
        "stock_analysis_orchestrator.py"
        "update_stock_data.py"
        "cleanup_logs.sh"
    )
    
    for file in "${required_files[@]}"; do
        if [ ! -f "$PROJECT_DIR/$file" ]; then
            log_warn "필수 파일을 찾을 수 없습니다: $file"
        fi
    done
    
    # 로그 디렉토리 생성
    if [ ! -d "$LOG_DIR" ]; then
        log_info "로그 디렉토리 생성: $LOG_DIR"
        mkdir -p "$LOG_DIR"
    fi
    
    log_success "환경 검증 완료"
}

# PATH 환경 변수 생성 함수
generate_path() {
    local paths=()
    
    # pyenv 경로 추가 (있는 경우)
    if [ -d "$USER_HOME/.pyenv" ]; then
        paths+=("$USER_HOME/.pyenv/plugins/pyenv-virtualenv/shims")
        paths+=("$USER_HOME/.pyenv/shims")
        paths+=("$USER_HOME/.pyenv/bin")
    fi
    
    # 기본 시스템 경로
    paths+=("/usr/local/sbin")
    paths+=("/usr/local/bin")
    paths+=("/usr/sbin")
    paths+=("/usr/bin")
    paths+=("/sbin")
    paths+=("/bin")
    
    # 사용자 로컬 경로
    if [ -d "$USER_HOME/.local/bin" ]; then
        paths+=("$USER_HOME/.local/bin")
    fi
    
    # cargo 경로 (Rust, 있는 경우)
    if [ -d "$USER_HOME/.cargo/bin" ]; then
        paths+=("$USER_HOME/.cargo/bin")
    fi
    
    # 콜론으로 연결
    local IFS=':'
    echo "${paths[*]}"
}

# Crontab 엔트리 생성 함수
generate_crontab_entries() {
    cat << EOF
# =============================================================================
# PRISM-INSIGHT 자동 실행 스케줄
# Generated by setup_crontab.sh on $(date)
# =============================================================================

# 환경 변수 설정
SHELL=/bin/bash
PATH=$(generate_path)
PYTHONPATH=$PROJECT_DIR

# -----------------------------------------------------------------------------
# 백업 및 유지보수 (Backup & Maintenance)
# -----------------------------------------------------------------------------

# 매일 오전 2시에 중요 설정 및 데이터베이스 백업
$CONFIG_BACKUP_TIME * * * chmod +x $PROJECT_DIR/utils/backup_configs.sh && $PROJECT_DIR/utils/backup_configs.sh

# 매주 일요일 오전 3시에 트레이딩 메모리 압축 및 정리
$MEMORY_COMPRESSION_TIME * * 0 cd $PROJECT_DIR && $PYTHON_PATH compress_trading_memory.py >> $LOG_DIR/compression.log 2>&1

# 매일 오전 3시에 로그 파일 정리
$LOG_CLEANUP_TIME * * * chmod +x $PROJECT_DIR/utils/cleanup_logs.sh && $PROJECT_DIR/utils/cleanup_logs.sh

# -----------------------------------------------------------------------------
# 주식 분석 배치 작업 (Stock Analysis Batch)
# -----------------------------------------------------------------------------

# 매일 오전 7시에 종목 정보 업데이트 (장 시작 전, 월-금)
$DATA_UPDATE_TIME * * 1-5 cd $PROJECT_DIR && $PYTHON_PATH update_stock_data.py >> $LOG_DIR/stock_update_\$(date +\%Y\%m\%d).log 2>&1

# 매일 오전 9시 30분에 오전 배치 실행 (월-금)
$MORNING_BATCH_TIME * * 1-5 cd $PROJECT_DIR && $PYTHON_PATH stock_analysis_orchestrator.py --mode morning >> $LOG_DIR/stock_analysis_morning_\$(date +\%Y\%m\%d).log 2>&1

# 매일 오후 3시 40분에 오후 배치 실행 (월-금)
$AFTERNOON_BATCH_TIME * * 1-5 cd $PROJECT_DIR && $PYTHON_PATH stock_analysis_orchestrator.py --mode afternoon >> $LOG_DIR/stock_analysis_afternoon_\$(date +\%Y\%m\%d).log 2>&1

# -----------------------------------------------------------------------------
# 대시보드 및 성과 추적 (Dashboard & Performance Tracking)
# -----------------------------------------------------------------------------

# 매일 오전 11시 5분에 대시보드 데이터 갱신 (월-금)
$DASHBOARD_REFRESH_AM_TIME * * 1-5 cd $PROJECT_DIR && $PYTHON_PATH examples/generate_dashboard_json.py >> $LOG_DIR/generate_dashboard_json.log 2>&1

# 매일 오후 5시에 성과 추적 업데이트 (월-금) - 대시보드 갱신 전 실행
$PERFORMANCE_TRACKER_TIME * * 1-5 cd $PROJECT_DIR && $PYTHON_PATH performance_tracker_batch.py >> $LOG_DIR/performance_tracker.log 2>&1

# 매일 오후 5시 10분에 대시보드 데이터 갱신 (월-금)
$DASHBOARD_REFRESH_PM_TIME * * 1-5 cd $PROJECT_DIR && $PYTHON_PATH examples/generate_dashboard_json.py >> $LOG_DIR/generate_dashboard_json.log 2>&1

# -----------------------------------------------------------------------------
# 포트폴리오 리포트 (선택사항 - 필요시 주석 해제)
# -----------------------------------------------------------------------------

# 매일 오후 6시에 포트폴리오 리포트 생성 (월-금)
# $PORTFOLIO_REPORT_TIME * * 1-5 cd $PROJECT_DIR && $PYTHON_PATH trading/portfolio_telegram_reporter.py --type full >> $LOG_DIR/portfolio_report_\$(date +\%Y\%m\%d).log 2>&1

# =============================================================================
# 추가 스케줄 예시 (필요에 따라 주석 해제하여 사용)
# =============================================================================

# 매주 일요일 오후 10시에 주간 리포트 생성
# 0 22 * * 0 cd $PROJECT_DIR && $PYTHON_PATH weekly_report.py >> $LOG_DIR/weekly_report.log 2>&1

# 매월 1일 오전 6시에 월간 통계 생성
# 0 6 1 * * cd $PROJECT_DIR && $PYTHON_PATH monthly_stats.py >> $LOG_DIR/monthly_stats.log 2>&1

EOF
}

# 현재 crontab 백업 함수
backup_crontab() {
    local backup_file="$PROJECT_DIR/crontab_backup_$(date +%Y%m%d_%H%M%S).txt"
    
    if crontab -l &> /dev/null; then
        log_info "현재 crontab을 백업합니다: $backup_file"
        crontab -l > "$backup_file"
        log_success "백업 완료"
    else
        log_info "기존 crontab이 없습니다."
    fi
}

# Crontab 설치 함수
install_crontab() {
    local temp_cron="/tmp/prism_crontab_$$"
    
    # 기존 crontab 가져오기 (있는 경우)
    if crontab -l &> /dev/null; then
        crontab -l > "$temp_cron"
        
        # 기존 PRISM-INSIGHT 엔트리 제거
        sed -i '/PRISM-INSIGHT/,/^$/d' "$temp_cron"
        echo "" >> "$temp_cron"
    else
        > "$temp_cron"
    fi
    
    # 새 엔트리 추가
    generate_crontab_entries >> "$temp_cron"
    
    # Crontab 설치
    crontab "$temp_cron"
    rm -f "$temp_cron"
    
    log_success "Crontab이 성공적으로 설치되었습니다!"
}

# 설치 확인 함수
verify_installation() {
    log_info "설치된 crontab 확인:"
    echo "----------------------------------------"
    crontab -l | grep -A 20 "PRISM-INSIGHT" || log_warn "PRISM-INSIGHT 엔트리를 찾을 수 없습니다."
    echo "----------------------------------------"
}

# 대화형 설정 함수
interactive_setup() {
    echo -e "${BLUE}================================================${NC}"
    echo -e "${BLUE}   PRISM-INSIGHT Crontab 설정 도구${NC}"
    echo -e "${BLUE}================================================${NC}"
    echo
    
    # 프로젝트 경로 확인
    read -p "프로젝트 경로 [$PROJECT_DIR]: " input_dir
    PROJECT_DIR="${input_dir:-$PROJECT_DIR}"
    
    # Python 경로 확인
    read -p "Python 실행 파일 경로 [$PYTHON_PATH]: " input_python
    PYTHON_PATH="${input_python:-$PYTHON_PATH}"
    
    # 로그 디렉토리 확인
    read -p "로그 디렉토리 [$LOG_DIR]: " input_log
    LOG_DIR="${input_log:-$LOG_DIR}"
    
    echo
    log_info "다음 설정으로 진행합니다:"
    echo "  프로젝트 경로: $PROJECT_DIR"
    echo "  Python 경로: $PYTHON_PATH"
    echo "  로그 디렉토리: $LOG_DIR"
    echo
    
    read -p "계속하시겠습니까? (y/N): " confirm
    if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
        log_info "취소되었습니다."
        exit 0
    fi
}

# 제거 함수
uninstall_crontab() {
    log_info "PRISM-INSIGHT crontab 엔트리를 제거합니다..."
    
    local temp_cron="/tmp/prism_crontab_remove_$$"
    
    if crontab -l &> /dev/null; then
        crontab -l > "$temp_cron"
        
        # PRISM-INSIGHT 관련 엔트리 제거
        sed -i '/PRISM-INSIGHT/,/^$/d' "$temp_cron"
        
        # 빈 파일이 아닌 경우에만 다시 설치
        if [ -s "$temp_cron" ]; then
            crontab "$temp_cron"
        else
            crontab -r
        fi
        
        rm -f "$temp_cron"
        log_success "PRISM-INSIGHT crontab 엔트리가 제거되었습니다."
    else
        log_info "제거할 crontab이 없습니다."
    fi
}

# 도움말 출력 함수
show_help() {
    cat << EOF
사용법: $0 [옵션]

옵션:
  -h, --help        이 도움말을 표시합니다
  -i, --install     Crontab을 설치합니다 (기본값)
  -u, --uninstall   PRISM-INSIGHT crontab 엔트리를 제거합니다
  -s, --show        현재 설치된 crontab을 표시합니다
  -b, --backup      현재 crontab을 백업합니다
  --non-interactive 대화형 모드를 건너뜁니다

환경 변수:
  PROJECT_DIR   프로젝트 디렉토리 경로 (기본값: 현재 디렉토리)
  PYTHON_PATH   Python 실행 파일 경로 (기본값: 자동 감지)
  LOG_DIR       로그 디렉토리 경로 (기본값: \$PROJECT_DIR/logs)

예시:
  # 대화형 설치
  $0

  # 환경 변수를 사용한 자동 설치
  PROJECT_DIR=/opt/prism-insight PYTHON_PATH=/usr/bin/python3 $0 --non-interactive

  # 제거
  $0 --uninstall

EOF
}

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

main() {
    local action="install"
    local interactive=true
    
    # 명령줄 인자 파싱
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -i|--install)
                action="install"
                shift
                ;;
            -u|--uninstall)
                action="uninstall"
                shift
                ;;
            -s|--show)
                action="show"
                shift
                ;;
            -b|--backup)
                action="backup"
                shift
                ;;
            --non-interactive)
                interactive=false
                shift
                ;;
            *)
                log_error "알 수 없는 옵션: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    # 작업 실행
    case $action in
        install)
            if $interactive; then
                interactive_setup
            fi
            validate_environment
            backup_crontab
            install_crontab
            verify_installation
            
            echo
            log_success "설치가 완료되었습니다!"
            log_info "다음 명령으로 crontab을 확인할 수 있습니다: crontab -l"
            log_info "로그는 $LOG_DIR 디렉토리에서 확인할 수 있습니다."
            ;;
            
        uninstall)
            if $interactive; then
                read -p "정말로 PRISM-INSIGHT crontab 엔트리를 제거하시겠습니까? (y/N): " confirm
                if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
                    log_info "취소되었습니다."
                    exit 0
                fi
            fi
            backup_crontab
            uninstall_crontab
            ;;
            
        show)
            log_info "현재 설치된 PRISM-INSIGHT crontab:"
            echo "----------------------------------------"
            crontab -l 2>/dev/null | grep -A 30 "PRISM-INSIGHT" || log_warn "PRISM-INSIGHT 엔트리가 없습니다."
            ;;
            
        backup)
            backup_crontab
            ;;
    esac
}

# 스크립트 실행
main "$@"
