GNU/skin/board/maria_event/view.skin.php
<?php
if (!defined('_GNUBOARD_')) exit;

add_stylesheet('<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">', 0);
include_once(G5_LIB_PATH.'/thumbnail.lib.php');

// 외부 스타일시트 연결 (나. 항목의 내용을 이 파일에 저장하세요)
add_stylesheet('<link rel="stylesheet" href="'.$board_skin_url.'/style.view.css">', 0);

$view_content = get_view_thumbnail($view['content']);
$is_run = ($view['x2_run'] == '1' || $view['x2_run'] == '실행' || strtolower($view['x2_run']) == 'run');

// DB 이벤트 정보 조회
$real_evt_sql = " SELECT * FROM information_schema.EVENTS WHERE EVENT_NAME = '".sql_real_escape_string($view['wr_subject'])."' ";
$real_evt = sql_fetch($real_evt_sql);

$db_status = isset($real_evt['STATUS']) ? $real_evt['STATUS'] : 'NOT FOUND';
$db_type   = isset($real_evt['EVENT_TYPE']) ? $real_evt['EVENT_TYPE'] : '-';
$db_definer= isset($real_evt['DEFINER']) ? $real_evt['DEFINER'] : '-'; 
$db_starts = isset($real_evt['STARTS']) ? $real_evt['STARTS'] : '-';
$db_ends   = isset($real_evt['ENDS']) ? $real_evt['ENDS'] : 'FOREVER';
$db_definition = isset($real_evt['EVENT_DEFINITION']) ? $real_evt['EVENT_DEFINITION'] : '';

$master_value = trim((string)$view['x2_db_master']) !== '' ? $view['x2_db_master'] : '-';
$captain_value = trim((string)$view['x2_db_table']) !== ''
    ? $view['x2_db_table']
    : (trim((string)$view['x2_db_table_name']) !== '' ? $view['x2_db_table_name'] : '-');

$filter_ca_url = (trim((string)$view['ca_name']) !== '') ? G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&sfl=ca_name&stx='.urlencode($view['ca_name']) : '';
$filter_ca2_url = (trim((string)$view['x2_ca2']) !== '') ? G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&sfl=x2_ca2&stx='.urlencode($view['x2_ca2']) : '';
$filter_ca3_url = (trim((string)$view['x2_ca3']) !== '') ? G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&sfl=x2_ca3&stx='.urlencode($view['x2_ca3']) : '';

if (isset($real_evt['INTERVAL_VALUE']) && isset($real_evt['INTERVAL_FIELD'])) {
    $db_interval = $real_evt['INTERVAL_VALUE'] . ' ' . $real_evt['INTERVAL_FIELD'];
} else {
    $db_interval = '-';
}

$status_class = '';
if ($db_status == 'ENABLED') $status_class = 'status-run';
else if ($db_status == 'DISABLED' || $db_status == 'SLAVESIDE_DISABLED') $status_class = 'status-stop';

// ==========================================================================
// [CORE] UPBIT DB 커넥션을 이용한 LAST_EXECUTED 조회 (기존 로직 대체)
// ==========================================================================
global $db_upbit;
$last_executed_time = '-';

if ($db_upbit && isset($view['wr_subject'])) {
    $sql_exec = " SELECT LAST_EXECUTED 
                  FROM information_schema.EVENTS 
                  WHERE EVENT_SCHEMA = 'upbit_data' 
                  AND EVENT_NAME = '".sql_real_escape_string($view['wr_subject'])."' ";
    try {
        if ($db_upbit instanceof mysqli) {
            $res_e = mysqli_query($db_upbit, $sql_exec);
            if ($res_e) { 
                $row_e = mysqli_fetch_assoc($res_e); 
                $last_executed_time = (isset($row_e['LAST_EXECUTED']) && $row_e['LAST_EXECUTED']) ? $row_e['LAST_EXECUTED'] : '-'; 
            }
        } else if ($db_upbit instanceof PDO) {
            $stmt_e = $db_upbit->query($sql_exec);
            if ($stmt_e) { 
                $row_e = $stmt_e->fetch(PDO::FETCH_ASSOC); 
                $last_executed_time = (isset($row_e['LAST_EXECUTED']) && $row_e['LAST_EXECUTED']) ? $row_e['LAST_EXECUTED'] : '-'; 
            }
        }
    } catch (Exception $e) { 
        $last_executed_time = '-'; 
    }
}
?>

<article id="VIEW">
    <header class="Board-Info-Header">
        <div class="header-titles">
            <span class="bo-table-name"><?php echo mb_strtoupper($bo_table); ?></span>
            <div class="bo-subject-main">
                <i class="fa-solid fa-microchip"></i><?php echo $board['bo_subject']; ?>
            </div>
        </div>
        <div class="Btns-Right">
            <button onclick="location.href='<?php echo $list_href; ?>'" class="List-Btn-Footer"><i class="fa-solid fa-list"></i> 목록</button>
            <?php if ($update_href) { ?><button onclick="location.href='<?php echo $update_href; ?>'" class="List-Btn-Footer"><i class="fa-solid fa-pen-to-square"></i> 수정</button><?php } ?>
            <?php if ($write_href) { ?><button onclick="location.href='<?php echo $write_href; ?>'" class="Write-Btn"><i class="fa-solid fa-pen"></i> 글쓰기</button><?php } ?>
        </div>
    </header>

    <section class="Data-Dashboard-Section">
        <div class="info-box subject-box">
            <div class="subject-box-top">
                <div class="subject-main-info">
                    <span class="label"><i class="fa-solid fa-bolt"></i> 이벤트</span>
                    <div class="subject-main-line">
                        <span class="subject-main-event"><?php echo get_text($view['wr_subject']); ?></span>
                        <?php if(isset($view['wr_subject_kor']) && $view['wr_subject_kor']) { ?>
                            <span class="subject-main-kor"><?php echo get_text($view['wr_subject_kor']); ?></span>
                        <?php } ?>
                        <span class="subject-option-icons">
                            <?php if (!empty($view['x2_top'])) { ?><i class="fa-solid fa-circle-up option-icon option-icon--top" title="우선"></i><?php } ?>
                            <?php if (!empty($view['x2_label'])) { ?><i class="fa-solid fa-tag option-icon option-icon--label" title="라벨"></i><?php } ?>
                            <?php if (!empty($view['x2_core'])) { ?><i class="fa-solid fa-gem option-icon option-icon--core" title="핵심"></i><?php } ?>
                        </span>
                    </div>
                </div>
                <div class="subject-sub-info">
                    <span class="label"><i class="fa-solid fa-diagram-project"></i> 대장</span>
                    <div class="value accent-blue"><?php echo get_text($captain_value); ?></div>
                    <button type="button" class="event-edit-btn" onclick="openEventEditor('<?php echo $bo_table; ?>', '<?php echo (int)$wr_id; ?>');">
                        <i class="fa-solid fa-pen"></i> 이벤트 편집
                    </button>
                </div>
            </div>

            <?php if(isset($view['wr_1']) && $view['wr_1']) { ?>
                <div class="subject-extra-info">
                    <i class="fa-solid fa-circle-info"></i>
                    <?php echo get_text($view['wr_1']); ?>
                </div>
            <?php } ?>

            <div class="subject-meta-row">
                <div class="subject-meta-item">
                    <span class="meta-label"><i class="fa-regular fa-clock"></i> 타임스탬프</span>
                    <span class="meta-value"><?php echo date("Y-m-d H:i:s", strtotime($view['wr_datetime'])); ?></span>
                </div>
                <div class="subject-meta-item">
                    <span class="meta-label"><i class="fa-solid fa-layer-group"></i> 원장</span>
                    <span class="meta-value"><?php echo get_text($master_value); ?></span>
                </div>
            </div>
        </div>

        <div class="info-box">
            <span class="label"><i class="fa-solid fa-power-off"></i> 관리 설정</span>
            <div class="value <?php echo $is_run ? 'status-run' : 'status-stop'; ?>">
                <i class="fa-solid fa-circle-dot"></i>
                <?php echo $is_run ? '가동 중' : '중지됨'; ?>
            </div>
        </div>

        <div class="info-box">
            <span class="label"><i class="fa-solid fa-database"></i> DB 엔진 상태</span>
            <div class="value <?php echo $status_class; ?>">
                <?php echo $db_status; ?>
            </div>
        </div>

        <div class="info-box">
            <span class="label"><i class="fa-solid fa-sitemap"></i> 이벤트 종류</span>
            <div class="value"><?php echo $db_type; ?></div>
        </div>

        <div class="info-box">
            <span class="label"><i class="fa-solid fa-stopwatch"></i> 실행 간격</span>
            <div class="value"><?php echo $db_interval; ?></div>
        </div>

        <div class="info-box">
            <span class="label"><i class="fa-solid fa-user-gear"></i> 정의자</span>
            <div class="value definer-text"><?php echo $db_definer; ?></div>
        </div>

        <div class="info-box">
            <span class="label"><i class="fa-solid fa-folder-tree"></i> 카테고리</span>
            <div class="value"><?php echo ($view['ca_name']) ? $view['ca_name'] : '없음'; ?></div>
        </div>

        <div class="info-box">
            <span class="label"><i class="fa-solid fa-layer-group"></i> 종류</span>
            <div class="value"><?php echo ($view['x2_ca2']) ? $view['x2_ca2'] : '-'; ?></div>
        </div>

        <div class="info-box">
            <span class="label"><i class="fa-solid fa-shapes"></i> 형태</span>
            <div class="value"><?php echo ($view['x2_ca3']) ? $view['x2_ca3'] : '-'; ?></div>
        </div>
        
        <div class="info-box">
            <span class="label"><i class="fa-solid fa-layer-group"></i> 원장</span>
            <div class="value"><?php echo get_text($master_value); ?></div>
        </div>

        <div class="info-box">
            <span class="label"><i class="fa-solid fa-diagram-project"></i> 대장</span>
            <div class="value"><?php echo get_text($captain_value); ?></div>
        </div>

        <div class="info-box full-row-flex">
             <div class="time-range-group">
                <div class="time-item">
                    <span class="label"><i class="fa-solid fa-play"></i> 시작 일시</span>
                    <div class="value starts-time"><?php echo $db_starts; ?></div>
                </div>
                <div class="time-item">
                    <span class="label"><i class="fa-solid fa-flag-checkered"></i> 종료 일시</span>
                    <div class="value ends-time"><?php echo $db_ends; ?></div>
                </div>
             </div>
             <div class="last-altered-group">
                 <span class="label"><i class="fa-solid fa-pen-ruler"></i> 최종 수정</span>
                 <div class="value altered-time">
                    <?php echo isset($real_evt['LAST_ALTERED']) ? $real_evt['LAST_ALTERED'] : '-'; ?>
                 </div>
             </div>
        </div>
    </section>

    <div class="View-Content View-Content--update">
        <span class="label"><i class="fa-solid fa-clock-rotate-left"></i> 마지막 실행</span>
        <div class="value">
            <i class="fa-solid fa-clock-rotate-left"></i>
            <?php echo get_text($view['wr_subject']); ?> : <span class="dynamic-update-value"><?php echo $last_executed_time; ?></span>
        </div>
    </div>

    <div class="View-Content View-Content--update-meta">
        <div class="meta-mini-item">
            <span class="label"><i class="fa-solid fa-building-columns"></i> 거래소</span>
            <?php if ($filter_ca_url) { ?>
                <a href="<?php echo $filter_ca_url; ?>" class="value meta-mini-link"><?php echo get_text($view['ca_name']); ?></a>
            <?php } else { ?>
                <div class="value">-</div>
            <?php } ?>
        </div>
        <div class="meta-mini-item">
            <span class="label"><i class="fa-solid fa-layer-group"></i> 종류</span>
            <?php if ($filter_ca2_url) { ?>
                <a href="<?php echo $filter_ca2_url; ?>" class="value meta-mini-link"><?php echo get_text($view['x2_ca2']); ?></a>
            <?php } else { ?>
                <div class="value">-</div>
            <?php } ?>
        </div>
        <div class="meta-mini-item">
            <span class="label"><i class="fa-solid fa-shapes"></i> 형태</span>
            <?php if ($filter_ca3_url) { ?>
                <a href="<?php echo $filter_ca3_url; ?>" class="value meta-mini-link"><?php echo get_text($view['x2_ca3']); ?></a>
            <?php } else { ?>
                <div class="value">-</div>
            <?php } ?>
        </div>
    </div>

    <?php if ($db_definition) { ?>
        <div class="View-Content">
            <div class="content-head-tools">
                <span class="label"><i class="fa-solid fa-file-code"></i> DB 이벤트 정의</span>
                <div class="content-tools">
                    <button type="button" class="content-tool-btn" onclick="copyContentById('db_definition_block')"><i class="fa-solid fa-copy"></i> 복사</button>
                    <button type="button" class="content-tool-btn" onclick="downloadContentById('db_definition_block', 'db_event_definition.txt')"><i class="fa-solid fa-download"></i> 다운로드</button>
                </div>
            </div>
            <pre id="db_definition_block" class="code-block View-Content--definition definition-scroll"><?php echo htmlspecialchars($db_definition); ?></pre>
        </div>
    <?php } ?>

    <?php if ($view_content || $view['file']['count']) { ?>
        <div class="View-Content View-Content--extra-green">
            <span class="label"><i class="fa-solid fa-circle-info"></i> 상세 내용</span>
            <div class="View-Body-Inner">
                <div id="bo_v_atc">
                    <div id="bo_v_img">
                        <?php
                        if ($view['file']['count']) {
                            for ($i=0; $i<count($view['file']); $i++) {
                                if (isset($view['file'][$i]['view']) && $view['file'][$i]['view']) {
                                    echo get_view_thumbnail($view['file'][$i]['view']);
                                }
                            }
                        }
                        ?>
                    </div>
                    <div id="bo_v_con" class="value">
                        <?php echo $view_content; ?>
                    </div>
                </div>
            </div>
        </div>
    <?php } ?>

    <?php if (isset($view['x2_content']) && trim($view['x2_content'])) { ?>
        <div class="View-Content View-Content--extra-blue">
            <div class="content-head-tools">
                <span class="label"><i class="fa-solid fa-note-sticky"></i> 추가 설명</span>
                <div class="content-tools">
                    <button type="button" class="content-tool-btn" onclick="copyContentById('x2_content_block')"><i class="fa-solid fa-copy"></i> 복사</button>
                    <button type="button" class="content-tool-btn" onclick="downloadContentById('x2_content_block', 'x2_content.txt')"><i class="fa-solid fa-download"></i> 다운로드</button>
                </div>
            </div>
            <div id="x2_content_block" class="value content-lined-box content-scroll"><?php echo nl2br(stripslashes($view['x2_content'])); ?></div>
        </div>
    <?php } ?>

    <?php if (isset($view['x2_content_2']) && trim($view['x2_content_2'])) { ?>
    <div class="View-Content View-Content--extra-blue">
        <span class="label"><i class="fa-solid fa-triangle-exclamation"></i> 특정 사항</span>
        <div class="value content-lined-box content-scroll"><?php echo nl2br(stripslashes($view['x2_content_2'])); ?></div>
    </div>
<?php } ?>

<?php if (isset($view['x2_memo']) && trim($view['x2_memo'])) { ?>
    <div class="View-Content View-Content--extra-blue">
        <div class="content-head-tools">
            <span class="label"><i class="fa-solid fa-note-sticky"></i> 메모</span>
            <?php if (isset($view['x2_memo_clean']) && trim($view['x2_memo_clean'])) { ?>
                <span class="memo-delete-badge" title="메모 삭제"><i class="fa-solid fa-trash-can"></i> 삭제</span>
            <?php } ?>
        </div>
        <div id="x2_memo_block" class="value content-lined-box content-scroll <?php echo (isset($view['x2_memo_clean']) && trim($view['x2_memo_clean'])) ? 'memo-deleted-content' : ''; ?>"><?php echo nl2br(stripslashes($view['x2_memo'])); ?></div>
    </div>
<?php } ?>

    <div class="View-Attached-Data">
        <?php
        for ($i=1; $i<=count($view['link']); $i++) {
            if ($view['link'][$i]) {
                $link = cut_str($view['link'][$i], 70);
        ?>
            <a href="<?php echo $view['link_href'][$i] ?>" target="_blank" class="data-item">
                <div class="data-info">
                    <i class="fa-solid fa-link"></i>
                    <span class="data-name"><?php echo $link ?></span>
                </div>
                <span class="data-meta">링크 연결 <i class="fa-solid fa-arrow-up-right-from-square"></i></span>
            </a>
        <?php
            }
        }
        ?>

        <?php
        if ($view['file']['count']) {
            for ($i=0; $i<count($view['file']); $i++) {
                if (isset($view['file'][$i]['source']) && !isset($view['file'][$i]['view'])) {
        ?>
            <a href="<?php echo $view['file'][$i]['href']; ?>" class="data-item">
                <div class="data-info">
                    <i class="fa-solid fa-download"></i>
                    <div>
                        <span class="data-name"><?php echo $view['file'][$i]['source']; ?></span>
                        <?php if($view['file'][$i]['bf_content']) { ?>
                        <span class="file-desc"><?php echo $view['file'][$i]['bf_content']; ?></span>
                        <?php } ?>
                    </div>
                </div>
                <div class="data-meta">
                    <span class="file-size"><?php echo $view['file'][$i]['size']; ?></span>
                    <span>다운로드: <?php echo $view['file'][$i]['download']; ?></span>
                </div>
            </a>
        <?php
                }
            }
        }
        ?>
    </div>

    <?php if ($view['x2_tag']) { ?>
    <div class="Custom-Tag-Area">
        <?php
        $tags = explode(',', $view['x2_tag']); 
        foreach($tags as $tag_val) {
            $tag_val = trim($tag_val);
            if($tag_val) {
                echo '<a href="'.G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&amp;stx='.urlencode($tag_val).'&amp;sfl=wr_subject||wr_content" class="x2-tag-item">#'.$tag_val.'</a>';
            }
        }
        ?>
    </div>
    <?php } ?>

    <nav class="Post-Navigation">
        <?php if ($prev_href) { ?>
            <a href="<?php echo $prev_href; ?>" class="nav-prev">
                <span class="nav-label"><i class="fa-solid fa-chevron-left"></i> 이전글</span>
                <p class="nav-subject"><?php echo $prev_wr_subject; ?></p>
            </a>
        <?php } else { ?>
            <div class="nav-empty nav-prev">첫 번째 게시물입니다.</div>
        <?php } ?>

        <?php if ($next_href) { ?>
            <a href="<?php echo $next_href; ?>" class="nav-next">
                <span class="nav-label">다음글 <i class="fa-solid fa-chevron-right"></i></span>
                <p class="nav-subject"><?php echo $next_wr_subject; ?></p>
            </a>
        <?php } else { ?>
            <div class="nav-empty nav-next">마지막 게시물입니다.</div>
        <?php } ?>
    </nav>

    <footer class="View-Bottom-Control">
        <div class="Admin-Control">
            <?php if ($delete_href) { ?><button onclick="if(confirm('정말 삭제하시겠습니까?')) location.href='<?php echo $delete_href; ?>';" class="List-Btn-Footer">삭제</button><?php } ?>
            <?php if ($copy_href) { ?><button onclick="window.open('<?php echo $copy_href; ?>', 'copy_win', 'width=600,height=500');" class="List-Btn-Footer">복사</button><?php } ?>
            <?php if ($move_href) { ?><button onclick="window.open('<?php echo $move_href; ?>', 'move_win', 'width=600,height=500');" class="List-Btn-Footer">이동</button><?php } ?>
        </div>
        <button onclick="location.href='<?php echo $list_href; ?>'" class="List-Btn-Footer">
            <i class="fa-solid fa-list-ul"></i> 목록으로 돌아가기
        </button>
    </footer>

    <div id="eventEditorModal" class="event-modal" aria-hidden="true">
        <div class="event-modal__backdrop" onclick="closeEventEditorModal()"></div>
        <div class="event-modal__dialog" role="dialog" aria-modal="true" aria-label="이벤트 편집">
            <div class="event-modal__head">
                <strong><i class="fa-solid fa-pen-to-square"></i> 마리아DB 이벤트 편집</strong>
                <button type="button" class="event-modal__close" onclick="closeEventEditorModal()"><i class="fa-solid fa-xmark"></i></button>
            </div>
            <iframe id="eventEditorFrame" class="event-modal__frame" src="about:blank" title="event editor"></iframe>
        </div>
    </div>
</article>
<?php include_once($board_skin_path.'/view/view.script.php'); ?>