<!doctype html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/layout :: head('조회 대상')}"></head>
<body>
<nav th:replace="~{fragments/layout :: nav}"></nav>
<main class="container py-4">
  <div class="page-title">
    <h1>조회 대상</h1>
    <details class="explanation-details">
      <summary>도움말</summary>
      <p>이 화면은 DB 객체를 HTTP로 연결할 경로만 등록합니다. 누가 어떤 행을 볼 수 있는지는 행 접근 규칙과 Oracle VPD 정책에서 결정합니다.</p>
    </details>
  </div>

  <div class="alert alert-info">
    <strong>지식 검색 연결:</strong> 문서 검색 단위와 기술 태그를 등록한 뒤 전용 ORDS 검색을 연결합니다.
    <details class="explanation-details mt-2">
      <summary>지식 검색 연결 흐름 보기</summary>
      <p>문서를 검색 단위로 나누고 기술 태그를 붙인 뒤 전용 ORDS 검색을 등록합니다. 그 다음 <a href="/permissions">행 접근 규칙</a>에서 <code>특정 기술 태그</code>를 여러 개 추가하면 태그 중 하나라도 맞는 검색 단위만 검색됩니다.</p>
    </details>
  </div>

  <div class="alert alert-success" th:if="${message}" th:text="${message}"></div>
  <div class="alert alert-danger" th:if="${errorMessage}" th:text="${errorMessage}"></div>

  <section class="content-band">
    <h2>조회 대상 추가</h2>
    <p class="section-subtitle">DB 객체 하나를 하나의 조회 Handler로 연결하는 기본 구성입니다.</p>
    <details class="explanation-details">
      <summary>대상 추가 후 생성되는 내용 보기</summary>
      <p>대상 추가 후 Handler를 생성하면 행 접근 context 설정과 기본 SELECT가 포함된 PL/SQL이 만들어집니다. 소스 보기에서 실제 업무에 맞게 수정할 수 있습니다.</p>
    </details>
    <form method="post" action="/objects" class="form-grid">
      <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
      <input type="hidden" name="owner" required>
      <input type="hidden" name="objectName" required>
      <label>
        DB 객체 선택
        <select class="form-select" id="objectCatalogSelect" required>
          <option value="">선택하세요</option>
          <option th:each="dbObject : ${dbObjects}"
                  th:value="${dbObject.value()}"
                  th:data-owner="${dbObject.owner()}"
                  th:data-object-name="${dbObject.objectName()}"
                  th:text="${dbObject.label()}"></option>
        </select>
      </label>
      <label>
        ORDS Path (자동)
        <input class="form-control" name="ordsPath" data-ords-path-input
               placeholder="DB 객체 선택 시 자동 입력" readonly required>
        <span class="form-hint">
          객체를 선택하면 기본 module/template 경로가 자동으로 입력됩니다. 비워 제출해도 서버가 같은 규칙으로 채웁니다.
          <label class="form-check form-check-inline ms-2">
            <input class="form-check-input" type="checkbox" data-ords-path-edit>
            <span class="form-check-label">고급: 직접 수정</span>
          </label>
        </span>
      </label>
      <label>
        조회 대상 설명
        <input class="form-control" name="description" maxlength="200"
               placeholder="예: 기술 태그 권한이 적용된 지식자료 검색">
      </label>
      <button class="btn btn-primary" type="submit">대상 추가</button>
    </form>
    <details class="explanation-details explanation-warning mt-3">
      <summary>기본 Handler 구성과 수정 가이드 보기</summary>
      <p><code>cb_ords_handler_pkg.set_vpd_context(:auth_header, :probe_id)</code>로 토큰의 사용자·역할 컨텍스트와 검증 요청 식별자를 넣고, 선택한 한 테이블에 <code>SELECT ... FROM OWNER.TABLE</code>을 실행한 뒤 JSON으로 반환합니다. 이것은 유일한 사용 방식이 아니라 시작점이며, Handler 소스와 ORDS 메타데이터에서 수정할 수 있습니다. 컬럼 민감도·마스킹은 이 화면에서 다루지 않고 <a href="/masking-rules">컬럼 마스킹</a>에서 별도로 설정합니다.</p>
    </details>
  </section>

  <section class="content-band">
    <div class="section-heading">
      <div>
        <h2>조회 대상 목록</h2>
        <p class="section-subtitle">ORDS Path와 Handler 상태를 관리합니다. 접근 권한은 이 표에서 만들지 않습니다.</p>
      </div>
    </div>
    <div class="table-responsive">
      <table class="table table-sm align-middle">
        <thead>
        <tr>
          <th>ID</th>
          <th>Owner</th>
          <th>Object</th>
          <th>설명</th>
          <th>ORDS Path</th>
          <th>Action</th>
        </tr>
        </thead>
        <tbody>
        <th:block th:each="object : ${objects}">
          <tr>
            <td th:text="${object.objectId()}">1</td>
            <td th:text="${object.owner()}">ADMIN</td>
            <td th:text="${object.objectName()}">CB_V_SEARCH_DOCUMENTS</td>
            <td>
              <form method="post" action="/objects/description" class="inline-form">
                <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
                <input type="hidden" name="objectId" th:value="${object.objectId()}">
                <input class="form-control form-control-sm" name="description" maxlength="200"
                       th:value="${object.description()}" placeholder="짧은 설명">
                <button class="btn btn-sm btn-outline-primary" type="submit">저장</button>
              </form>
              <small class="text-muted" th:text="${object.descriptionOrDefault()}">조회 대상 설명</small>
            </td>
            <td>
              <form method="post" action="/objects/ords-path" class="inline-form">
                <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
                <input type="hidden" name="objectId" th:value="${object.objectId()}">
                <input class="form-control form-control-sm" name="ordsPath" th:value="${object.ordsPath()}" required>
                <button class="btn btn-sm btn-outline-primary" type="submit">저장</button>
              </form>
            </td>
            <td>
              <div class="action-stack" th:if="${object.objectName() == 'CB_VECTOR_SEARCH_DOCUMENTS'}">
                <span class="text-info small">전용 벡터 Handler 사용<br>(SQL 29, EMBEDDING 미노출)</span>
              </div>
              <div class="action-stack" th:unless="${object.objectName() == 'CB_VECTOR_SEARCH_DOCUMENTS'}">
                <form method="post" action="/objects/ords-handler" class="inline-form">
                  <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
                  <input type="hidden" name="objectId" th:value="${object.objectId()}">
                  <button class="btn btn-sm btn-outline-primary" type="submit">Handler 생성</button>
                </form>
                <button class="btn btn-sm btn-outline-secondary"
                        type="button"
                        th:hx-get="@{/objects/ords-handler-source(objectId=${object.objectId()})}"
                        th:hx-target="${'#handler-source-' + object.objectId()}"
                        hx-swap="innerHTML">소스 보기</button>
                <form method="post" action="/objects/disable" class="inline-form">
                  <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
                  <input type="hidden" name="objectId" th:value="${object.objectId()}">
                  <button class="btn btn-sm btn-outline-danger" type="submit">비활성화</button>
                </form>
              </div>
            </td>
          </tr>
          <tr>
            <td colspan="6" class="policy-source-cell">
              <details class="explanation-details">
                <summary>이 대상의 자동 연결 흐름 보기</summary>
                <div class="object-handler-explainer">
                  <strong>토큰 헤더 → 행 접근 context 설정 → 선택한 단일 테이블의 기본 SELECT → JSON 응답</strong>
                  <small>행 접근은 행 접근 규칙과 Oracle VPD 정책이 담당합니다. 컬럼 원문/마스킹은 컬럼 마스킹의 ASO/Data Redaction 설정에서 관리하세요.</small>
                </div>
              </details>
              <div th:if="${object.objectName() != 'CB_VECTOR_SEARCH_DOCUMENTS'}"
                   th:id="${'handler-source-' + object.objectId()}" class="text-muted small">
                소스 보기를 누르면 기본 Handler PL/SQL이 표시됩니다.
              </div>
              <div th:if="${object.objectName() == 'CB_VECTOR_SEARCH_DOCUMENTS'}" class="text-muted small">
                전용 벡터 검색 Handler는 SQL 29에서 등록합니다.
              </div>
            </td>
          </tr>
        </th:block>
        <tr th:if="${#lists.isEmpty(objects)}">
          <td colspan="6" class="text-muted">등록된 조회 Handler 대상이 없습니다.</td>
        </tr>
        </tbody>
      </table>
    </div>
  </section>
</main>
</body>
</html>
