-- 정부지원사업 스크래퍼 스키마
-- 기존 sundol 컨벤션 준수: snake_case 테이블, RAW(16) id(SYS_GUID()), TIMESTAMP(SYSTIMESTAMP)
-- 실행: SQLcl 에서 @government/db/schema.sql

-- ============================================================
-- gov_source : 공고 소스(사이트) 목록. Strategy 어댑터가 이 행을 읽어 동작한다.
-- ============================================================
CREATE TABLE gov_source (
    id              RAW(16)        DEFAULT SYS_GUID() PRIMARY KEY,
    code            VARCHAR2(50)   NOT NULL,            -- 어댑터 식별자 (예: kstartup, bizinfo, smes)
    name            VARCHAR2(200)  NOT NULL,            -- 표시명
    base_url        VARCHAR2(500),                      -- 기준 URL
    type            VARCHAR2(20)   NOT NULL,            -- API | HTML
    config          CLOB,                               -- 어댑터 설정(JSON): endpoint, params, selectors 등
    active          NUMBER(1)      DEFAULT 1 NOT NULL,  -- 1=활성, 0=비활성
    last_crawled_at TIMESTAMP,
    created_at      TIMESTAMP      DEFAULT SYSTIMESTAMP NOT NULL,
    updated_at      TIMESTAMP      DEFAULT SYSTIMESTAMP NOT NULL,
    CONSTRAINT gov_source_code_uq UNIQUE (code),
    CONSTRAINT gov_source_type_ck CHECK (type IN ('API', 'HTML')),
    CONSTRAINT gov_source_active_ck CHECK (active IN (0, 1))
);

-- ============================================================
-- gov_opportunity : 수집된 공고. (source_code, external_id) 로 중복 제거.
--   external_id 는 항상 채운다. HTML 소스는 detail_url 해시로 채운다.
-- ============================================================
CREATE TABLE gov_opportunity (
    id                  RAW(16)        DEFAULT SYS_GUID() PRIMARY KEY,
    source_id           RAW(16)        NOT NULL,
    source_code         VARCHAR2(50)   NOT NULL,            -- 비정규화(조회 편의)
    external_id         VARCHAR2(200)  NOT NULL,            -- 소스 고유 키(pbancSn 등) 또는 detail_url 해시
    title               VARCHAR2(1000 CHAR) NOT NULL,
    agency              VARCHAR2(300 CHAR),                 -- 소관/주관기관
    category            VARCHAR2(200 CHAR),                 -- 지원분야
    target              VARCHAR2(1000 CHAR),                -- 지원대상
    apply_start         DATE,
    apply_end           DATE,
    detail_url          VARCHAR2(1000),
    body_text           CLOB,                               -- 상세 본문(스크랩)
    raw_json            CLOB,                               -- 원본 API/스크랩 데이터
    status              VARCHAR2(20)   DEFAULT 'LISTED' NOT NULL, -- LISTED | DETAILED | CLOSED | ERROR
    list_collected_at   TIMESTAMP,                          -- 목록 수집 시각
    detail_collected_at TIMESTAMP,                          -- 상세 수집 시각
    created_at          TIMESTAMP      DEFAULT SYSTIMESTAMP NOT NULL,
    updated_at          TIMESTAMP      DEFAULT SYSTIMESTAMP NOT NULL,
    CONSTRAINT gov_opp_source_fk FOREIGN KEY (source_id) REFERENCES gov_source (id),
    CONSTRAINT gov_opp_dedup_uq UNIQUE (source_code, external_id),
    CONSTRAINT gov_opp_status_ck CHECK (status IN ('LISTED', 'DETAILED', 'CLOSED', 'ERROR'))
);

CREATE INDEX gov_opp_status_ix    ON gov_opportunity (status);
CREATE INDEX gov_opp_apply_end_ix ON gov_opportunity (apply_end);
CREATE INDEX gov_opp_source_ix    ON gov_opportunity (source_id);
