#!/usr/bin/env php
<?php
/**
 * ptyCronBuild - 크론탭 스케줄 자동 설정
 *
 * Usage: ./ptyCronBuild "스크립트명" [옵션]
 *
 * 스케줄 옵션 (하나만 선택):
 *   --daily            매일 0시에 실행
 *   --daily-5min       매일 5분마다 실행
 *   --daily-10min      매일 10분마다 실행
 *   --daily-30min      매일 30분마다 실행
 *   --daily-hour       매일 1시간마다 실행
 *   --help             도움말 출력
 *
 * 예제:
 *   ./ptyCronBuild "php /path/to/script.php" --daily-5min
 *   ./ptyCronBuild "/var/lib/backup.sh" --daily
 */

namespace platyFramework;

require_once __DIR__ . '/ptyLibrary_PHP/cli/ptyCliOptionParser.php';
require_once __DIR__ . '/ptyLibrary_PHP/cli/ptyCliLog.php';

// 인자 파싱
$parsed = ptyCliOptionParser::parse($argv);
$positionalArgs = $parsed['positional'];
$options = $parsed['options'];

// 도움말
if (empty($positionalArgs) || isset($options['help'])) {
    echo "사용법: {$argv[0]} \"스크립트명\" [옵션]\n";
    echo "\n";
    echo "스케줄 옵션 (하나만 선택):\n";
    echo "  --daily            매일 0시에 실행\n";
    echo "  --daily-5min       매일 5분마다 실행\n";
    echo "  --daily-10min      매일 10분마다 실행\n";
    echo "  --daily-30min      매일 30분마다 실행\n";
    echo "  --daily-hour       매일 1시간마다 실행\n";
    echo "  --help             도움말 출력\n";
    echo "\n";
    echo "예제:\n";
    echo "  {$argv[0]} \"php /path/to/script.php\" --daily-5min\n";
    echo "  {$argv[0]} \"/var/lib/backup.sh\" --daily\n";
    echo "  {$argv[0]} \"php script.php\" --daily-hour\n";
    echo "\n";
    exit(isset($options['help']) ? 0 : 1);
}

$scriptCommand = $positionalArgs[0];

// 로거 인스턴스 생성
$log = ptyCliLog("CRON", ptyCliLog::COLOR_MAGENTA, true);

// 스케줄 타입 확인
$scheduleType = null;
$cronExpression = null;

if (isset($options['daily'])) {
    $scheduleType = 'daily';
    $cronExpression = '0 0 * * *';
} elseif (isset($options['daily-5min'])) {
    $scheduleType = 'daily-5min';
    $cronExpression = '*/5 * * * *';
} elseif (isset($options['daily-10min'])) {
    $scheduleType = 'daily-10min';
    $cronExpression = '*/10 * * * *';
} elseif (isset($options['daily-30min'])) {
    $scheduleType = 'daily-30min';
    $cronExpression = '*/30 * * * *';
} elseif (isset($options['daily-hour'])) {
    $scheduleType = 'daily-hour';
    $cronExpression = '0 * * * *';
} else {
    $log->error("스케줄 옵션을 지정해야 합니다. (--daily, --daily-5min, --daily-10min, --daily-30min, --daily-hour)");
    exit(1);
}

try {
    $log->info("크론탭 설정 시작...");
    $log->info("스케줄 타입: {$scheduleType}");
    $log->info("크론 표현식: {$cronExpression}");
    $log->info("스크립트: {$scriptCommand}");

    // 현재 크론탭 읽기
    exec('crontab -l 2>/dev/null', $currentCron, $returnCode);

    // 크론탭이 없는 경우 빈 배열로 초기화
    if ($returnCode !== 0) {
        $currentCron = [];
    }

    // 같은 스크립트가 이미 등록되어 있는지 확인
    $marker = "# ptyCronBuild: " . md5($scriptCommand);
    $found = false;
    $newCron = [];

    foreach ($currentCron as $line) {
        if (strpos($line, $marker) !== false) {
            $found = true;
            $log->warning("기존 크론탭 항목을 찾았습니다. 업데이트합니다.");
            // 다음 줄(실제 크론 명령)을 건너뛰기 위한 플래그
            $skipNext = true;
            continue;
        }

        if (isset($skipNext) && $skipNext) {
            $skipNext = false;
            continue;
        }

        $newCron[] = $line;
    }

    // 새로운 크론 항목 추가
    $newCron[] = $marker;
    $newCron[] = "{$cronExpression} {$scriptCommand}";

    // 임시 파일에 크론탭 작성
    $tmpFile = tempnam(sys_get_temp_dir(), 'cron_');
    file_put_contents($tmpFile, implode("\n", $newCron) . "\n");

    // 크론탭 설치
    exec("crontab {$tmpFile}", $output, $returnCode);
    unlink($tmpFile);

    if ($returnCode !== 0) {
        throw new \Exception("크론탭 설치 실패");
    }

    if ($found) {
        $log->success("크론탭 항목이 업데이트되었습니다.");
    } else {
        $log->success("크론탭 항목이 추가되었습니다.");
    }

    // 등록된 크론탭 확인
    $log->info("\n현재 크론탭:");
    exec('crontab -l', $finalCron);
    foreach ($finalCron as $line) {
        if (!empty(trim($line))) {
            echo "  {$line}\n";
        }
    }

} catch (\Exception $e) {
    $log->error("Error: " . $e->getMessage());
    exit(1);
}
