-- ================================================================
-- WING 해양환경 위기대응 통합시스템 데이터베이스
-- 공공데이터베이스 표준화 관리 매뉴얼(2021.06) 기준 적용
-- PostgreSQL 16 + PostGIS 3.4
-- ================================================================
--
-- [표준화 적용 원칙]
-- 1. 표준단어: 한글명 → 영문약어명 매핑 (별도 사전 참조)
-- 2. 표준도메인: 분류명 + 데이터타입 + 길이 규칙
-- 3. 표준용어: 컬럼 물리명 = 영문약어명 조합 (언더스코어 구분, 30자 이내)
-- 4. 저장형식: 날짜 YYYYMMDD(C8), 일시 TIMESTAMP, 여부 Y/N(C1)
-- 5. 표준코드: 공통코드 테이블로 관리
--
-- ================================================================
-- 표준단어 사전 (WING 도메인)
-- ================================================================
-- | 한글명       | 영문약어명  | 영문전체명              |
-- |-------------|----------|----------------------|
-- | 사고         | ACDNT    | Accident             |
-- | 활성         | ACTV     | Active               |
-- | 알고리즘      | ALGO     | Algorithm            |
-- | 시작         | BGNG     | Beginning            |
-- | 오일펜스      | BOOM     | Boom                 |
-- | 코드         | CD       | Code                 |
-- | 공통         | CMN      | Common               |
-- | 완료         | CMPL     | Completion           |
-- | 내용         | CN       | Content              |
-- | 해안         | CST      | Coast                |
-- | 설명         | DC       | Description          |
-- | 배치         | DPLY     | Deployment           |
-- | 일시         | DTM      | DateTime             |
-- | 효율         | EFCNC    | Efficiency           |
-- | 오류         | ERR      | Error                |
-- | 실행         | EXEC     | Execution            |
-- | 예측         | FCST     | Forecast             |
-- | 지오메트리    | GEOM     | Geometry             |
-- | 그룹         | GRP      | Group                |
-- | 시간         | HR       | Hour                 |
-- | 아이디       | ID       | Identifier           |
-- | 정보         | INFO     | Information          |
-- | 길이         | LEN      | Length               |
-- | 라인         | LINE     | Line                 |
-- | 위치         | LOC      | Location             |
-- | 미터         | M        | Meter                |
-- | 수정         | MDFCN    | Modification         |
-- | 메시지       | MSG      | Message              |
-- | 명           | NM       | Name                 |
-- | 번호         | NO       | Number               |
-- | 발생         | OCCRN    | Occurrence           |
-- | 유종         | OILTP    | OilType              |
-- | 조직         | ORG      | Organization         |
-- | 비밀번호      | PSWD     | Password             |
-- | 퍼센트       | PCT      | Percent              |
-- | 사진         | PHOTO    | Photo                |
-- | 예측         | PRED     | Prediction           |
-- | 우선순위      | PRIORT   | Priority             |
-- | 양           | QTY      | Quantity             |
-- | 등록         | REG      | Registration         |
-- | 등록자       | RGTR     | Registrant           |
-- | 직급         | RNKP     | RankPosition         |
-- | 역할         | ROLE     | Role                 |
-- | 보고         | RPT      | Report               |
-- | 책임         | RSPNS    | Responsible          |
-- | 결과         | RSLT     | Result               |
-- | SCAT        | SCAT     | SCAT                 |
-- | 초           | SEC      | Second               |
-- | 구간         | SECT     | Section              |
-- | 순번         | SN       | SequenceNumber       |
-- | 유출         | SPIL     | Spill                |
-- | 조사         | SRVY     | Survey               |
-- | 상태         | STTS     | Status               |
-- | 심각도       | SVRT     | Severity             |
-- | 촬영         | TAKNG    | Taking               |
-- | 유형         | TP       | Type                 |
-- | 단위         | UNIT     | Unit                 |
-- | 상위         | UPPER    | Upper                |
-- | 사용자       | USER     | User                 |
-- | 계정         | ACNT     | Account              |
-- | 여부         | YN       | YesNo                |
-- | 일자         | YMD      | YearMonthDay         |
-- | 구역         | ZONE     | Zone                 |
-- | 민감도       | SNSTVT   | Sensitivity          |
-- | 오염         | POLUT    | Pollution            |
-- | 정렬         | SORT     | Sort                 |
-- | 순서         | ORD      | Order                |
-- | 사용         | USE      | Use                  |
-- | 해시         | HASH     | Hash                 |
-- | 약칭         | ABBR     | Abbreviation         |
-- | 데이터       | DATA     | Data                 |
-- | 소요         | REQD     | Required             |
-- | 경로         | PATH     | Path                 |
-- | 파일         | FILE     | File                 |
-- | 비고         | RMK      | Remark               |
-- | 관할         | JRSD     | Jurisdiction         |
-- | 기관         | INST     | Institution          |
-- | 위도         | LAT      | Latitude             |
-- | 경도         | LON      | Longitude            |
-- ================================================================
-- 표준도메인 정의
-- ================================================================
-- | 도메인명          | 데이터타입          | 설명                    |
-- |-----------------|-------------------|------------------------|
-- | 순번N10          | SERIAL/INTEGER    | 순차번호 10자리          |
-- | 아이디V36        | UUID              | UUID 식별자 36자리       |
-- | 코드V10          | VARCHAR(10)       | 코드 10자리 이내         |
-- | 코드V20          | VARCHAR(20)       | 코드 20자리 이내         |
-- | 코드V50          | VARCHAR(50)       | 코드 50자리 이내         |
-- | 명칭V20          | VARCHAR(20)       | 명칭 20자리 이내         |
-- | 명칭V30          | VARCHAR(30)       | 명칭 30자리 이내         |
-- | 명칭V50          | VARCHAR(50)       | 명칭 50자리 이내         |
-- | 명칭V100         | VARCHAR(100)      | 명칭 100자리 이내        |
-- | 명칭V200         | VARCHAR(200)      | 명칭 200자리 이내        |
-- | 내용V255         | VARCHAR(255)      | 내용 255자리 이내        |
-- | 내용V500         | VARCHAR(500)      | 내용 500자리 이내        |
-- | 내용TEXT          | TEXT              | 대용량 텍스트            |
-- | 수량N5,2         | NUMERIC(5,2)      | 수량 소수점2자리          |
-- | 수량N10          | INTEGER           | 정수 수량               |
-- | 수량N10,2        | NUMERIC(10,2)     | 수량 소수점2자리          |
-- | 수량N12,2        | NUMERIC(12,2)     | 수량 소수점2자리          |
-- | 여부C1           | CHAR(1)           | Y/N 여부               |
-- | 연월일C8         | CHAR(8)           | YYYYMMDD              |
-- | 연월일시분초D     | TIMESTAMPTZ       | 타임스탬프(시간대포함)     |
-- | 경도N13,10       | NUMERIC(13,10)    | 경도 소수점10자리         |
-- | 위도N12,10       | NUMERIC(12,10)    | 위도 소수점10자리         |
-- | 지오메트리PNT     | GEOMETRY(Point)   | 포인트 공간정보           |
-- | 지오메트리LINE    | GEOMETRY(LineStr) | 라인 공간정보             |
-- | JSON            | JSONB             | JSON 바이너리           |
-- | 정렬순서N5       | INTEGER           | 정렬순서 5자리           |
-- ================================================================


-- ============================================================
-- 확장 설치
-- ============================================================
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS postgis_topology;
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";


-- ============================================================
-- 1. 공통코드 관리
-- ============================================================

-- 공통코드그룹 (CMN_CD_GRP)
-- 시스템 전체에서 사용되는 코드를 그룹 단위로 관리
CREATE TABLE CMN_CD_GRP (
  CMN_CD_GRP_ID   VARCHAR(20)   NOT NULL,  -- 공통코드그룹아이디
  CMN_CD_GRP_NM   VARCHAR(100)  NOT NULL,  -- 공통코드그룹명
  GRP_DC          VARCHAR(500),            -- 그룹설명
  USE_YN          CHAR(1)       NOT NULL DEFAULT 'Y',  -- 사용여부
  REG_DTM         TIMESTAMPTZ   NOT NULL DEFAULT NOW(), -- 등록일시
  CONSTRAINT PK_CMN_CD_GRP PRIMARY KEY (CMN_CD_GRP_ID),
  CONSTRAINT CK_CMN_CD_GRP_USE_YN CHECK (USE_YN IN ('Y','N'))
);

COMMENT ON TABLE  CMN_CD_GRP IS '공통코드그룹';
COMMENT ON COLUMN CMN_CD_GRP.CMN_CD_GRP_ID IS '공통코드그룹아이디';
COMMENT ON COLUMN CMN_CD_GRP.CMN_CD_GRP_NM IS '공통코드그룹명';
COMMENT ON COLUMN CMN_CD_GRP.GRP_DC         IS '그룹설명';
COMMENT ON COLUMN CMN_CD_GRP.USE_YN         IS '사용여부 (Y:사용, N:미사용)';
COMMENT ON COLUMN CMN_CD_GRP.REG_DTM        IS '등록일시';


-- 공통코드 (CMN_CD)
-- 각 그룹 내 개별 코드값을 관리
CREATE TABLE CMN_CD (
  CMN_CD_GRP_ID   VARCHAR(20)   NOT NULL,  -- 공통코드그룹아이디
  CMN_CD          VARCHAR(20)   NOT NULL,  -- 공통코드
  CMN_CD_NM       VARCHAR(100)  NOT NULL,  -- 공통코드명
  CD_DC           VARCHAR(500),            -- 코드설명
  SORT_ORD        INTEGER       DEFAULT 0, -- 정렬순서
  USE_YN          CHAR(1)       NOT NULL DEFAULT 'Y',  -- 사용여부
  REG_DTM         TIMESTAMPTZ   NOT NULL DEFAULT NOW(), -- 등록일시
  CONSTRAINT PK_CMN_CD PRIMARY KEY (CMN_CD_GRP_ID, CMN_CD),
  CONSTRAINT FK_CMN_CD_GRP FOREIGN KEY (CMN_CD_GRP_ID) REFERENCES CMN_CD_GRP(CMN_CD_GRP_ID),
  CONSTRAINT CK_CMN_CD_USE_YN CHECK (USE_YN IN ('Y','N'))
);

COMMENT ON TABLE  CMN_CD IS '공통코드';
COMMENT ON COLUMN CMN_CD.CMN_CD_GRP_ID IS '공통코드그룹아이디';
COMMENT ON COLUMN CMN_CD.CMN_CD        IS '공통코드';
COMMENT ON COLUMN CMN_CD.CMN_CD_NM     IS '공통코드명';
COMMENT ON COLUMN CMN_CD.CD_DC         IS '코드설명';
COMMENT ON COLUMN CMN_CD.SORT_ORD      IS '정렬순서';
COMMENT ON COLUMN CMN_CD.USE_YN        IS '사용여부 (Y:사용, N:미사용)';
COMMENT ON COLUMN CMN_CD.REG_DTM       IS '등록일시';


-- ============================================================
-- 2. 조직 (ORG)
-- ============================================================
CREATE TABLE ORG (
  ORG_SN          SERIAL        NOT NULL,  -- 조직순번
  ORG_NM          VARCHAR(100)  NOT NULL,  -- 조직명
  ORG_ABBR_NM     VARCHAR(20)   NOT NULL,  -- 조직약칭명
  ORG_TP_CD       VARCHAR(20)   NOT NULL,  -- 조직유형코드
  UPPER_ORG_SN    INTEGER,                 -- 상위조직순번
  REG_DTM         TIMESTAMPTZ   NOT NULL DEFAULT NOW(), -- 등록일시
  CONSTRAINT PK_ORG PRIMARY KEY (ORG_SN),
  CONSTRAINT FK_ORG_UPPER FOREIGN KEY (UPPER_ORG_SN) REFERENCES ORG(ORG_SN)
);

COMMENT ON TABLE  ORG IS '조직';
COMMENT ON COLUMN ORG.ORG_SN       IS '조직순번';
COMMENT ON COLUMN ORG.ORG_NM       IS '조직명 (기관 전체 명칭)';
COMMENT ON COLUMN ORG.ORG_ABBR_NM  IS '조직약칭명 (기관 약칭)';
COMMENT ON COLUMN ORG.ORG_TP_CD    IS '조직유형코드 (ORG_TP: headquarters, regional, station, agency)';
COMMENT ON COLUMN ORG.UPPER_ORG_SN IS '상위조직순번 (상위 기관 참조)';
COMMENT ON COLUMN ORG.REG_DTM      IS '등록일시';


-- ============================================================
-- 3. 사용자 (USER_INFO)
-- ※ USER는 PostgreSQL 예약어이므로 USER_INFO 사용
-- ============================================================
CREATE TABLE USER_INFO (
  USER_ID         UUID          NOT NULL DEFAULT uuid_generate_v4(), -- 사용자아이디
  USER_ACNT       VARCHAR(50)   NOT NULL,  -- 사용자계정
  PSWD_HASH       VARCHAR(255)  NOT NULL,  -- 비밀번호해시
  USER_NM         VARCHAR(50)   NOT NULL,  -- 사용자명
  RNKP_NM         VARCHAR(30),             -- 직급명
  ORG_SN          INTEGER,                 -- 조직순번
  ROLE_CD         VARCHAR(20)   NOT NULL DEFAULT 'USER', -- 역할코드
  ACTV_YN         CHAR(1)       NOT NULL DEFAULT 'Y',    -- 활성여부
  REG_DTM         TIMESTAMPTZ   NOT NULL DEFAULT NOW(),   -- 등록일시
  CONSTRAINT PK_USER_INFO PRIMARY KEY (USER_ID),
  CONSTRAINT UK_USER_ACNT UNIQUE (USER_ACNT),
  CONSTRAINT FK_USER_ORG FOREIGN KEY (ORG_SN) REFERENCES ORG(ORG_SN),
  CONSTRAINT CK_USER_ROLE_CD CHECK (ROLE_CD IN ('ADMIN','MANAGER','USER')),
  CONSTRAINT CK_USER_ACTV_YN CHECK (ACTV_YN IN ('Y','N'))
);

COMMENT ON TABLE  USER_INFO IS '사용자정보';
COMMENT ON COLUMN USER_INFO.USER_ID    IS '사용자아이디 (UUID)';
COMMENT ON COLUMN USER_INFO.USER_ACNT  IS '사용자계정 (로그인 ID)';
COMMENT ON COLUMN USER_INFO.PSWD_HASH  IS '비밀번호해시 (bcrypt 해시값)';
COMMENT ON COLUMN USER_INFO.USER_NM    IS '사용자명';
COMMENT ON COLUMN USER_INFO.RNKP_NM    IS '직급명';
COMMENT ON COLUMN USER_INFO.ORG_SN     IS '조직순번 (소속 조직)';
COMMENT ON COLUMN USER_INFO.ROLE_CD    IS '역할코드 (ADMIN, MANAGER, USER)';
COMMENT ON COLUMN USER_INFO.ACTV_YN    IS '활성여부 (Y:활성, N:비활성)';
COMMENT ON COLUMN USER_INFO.REG_DTM    IS '등록일시';


-- ============================================================
-- 4. 사고 (ACDNT)
-- ============================================================
CREATE TABLE ACDNT (
  ACDNT_SN        SERIAL        NOT NULL,  -- 사고순번
  ACDNT_CD        VARCHAR(20)   NOT NULL,  -- 사고코드
  ACDNT_NM        VARCHAR(200)  NOT NULL,  -- 사고명
  ACDNT_TP_CD     VARCHAR(50)   NOT NULL,  -- 사고유형코드
  ACDNT_STTS_CD   VARCHAR(20)   NOT NULL DEFAULT 'ACTIVE', -- 사고상태코드
  LOC_GEOM        GEOMETRY(Point, 4326) NOT NULL,           -- 위치지오메트리
  LOC_DC          VARCHAR(200),            -- 위치설명
  OCCRN_DTM       TIMESTAMPTZ   NOT NULL,  -- 발생일시
  RPT_DTM         TIMESTAMPTZ,             -- 보고일시
  RSPNS_ORG_SN    INTEGER,                 -- 책임조직순번
  SVRT_CD         VARCHAR(10),             -- 심각도코드
  RGTR_ID         UUID,                    -- 등록자아이디
  REG_DTM         TIMESTAMPTZ   NOT NULL DEFAULT NOW(), -- 등록일시
  MDFCN_DTM       TIMESTAMPTZ   NOT NULL DEFAULT NOW(), -- 수정일시
  CONSTRAINT PK_ACDNT PRIMARY KEY (ACDNT_SN),
  CONSTRAINT UK_ACDNT_CD UNIQUE (ACDNT_CD),
  CONSTRAINT FK_ACDNT_ORG FOREIGN KEY (RSPNS_ORG_SN) REFERENCES ORG(ORG_SN),
  CONSTRAINT FK_ACDNT_RGTR FOREIGN KEY (RGTR_ID) REFERENCES USER_INFO(USER_ID),
  CONSTRAINT CK_ACDNT_STTS CHECK (ACDNT_STTS_CD IN ('ACTIVE','MONITORING','CLOSED')),
  CONSTRAINT CK_ACDNT_SVRT CHECK (SVRT_CD IN ('DANGER','ALERT','CAUTION','INTEREST'))
);

COMMENT ON TABLE  ACDNT IS '사고';
COMMENT ON COLUMN ACDNT.ACDNT_SN      IS '사고순번';
COMMENT ON COLUMN ACDNT.ACDNT_CD      IS '사고코드 (예: INC-2025-0042)';
COMMENT ON COLUMN ACDNT.ACDNT_NM      IS '사고명';
COMMENT ON COLUMN ACDNT.ACDNT_TP_CD   IS '사고유형코드 (ACDNT_TP: 유조선충돌, 좌초 등)';
COMMENT ON COLUMN ACDNT.ACDNT_STTS_CD IS '사고상태코드 (ACTIVE:진행, MONITORING:감시, CLOSED:종료)';
COMMENT ON COLUMN ACDNT.LOC_GEOM      IS '위치지오메트리 (EPSG:4326 Point)';
COMMENT ON COLUMN ACDNT.LOC_DC        IS '위치설명 (텍스트 위치 표기)';
COMMENT ON COLUMN ACDNT.OCCRN_DTM     IS '발생일시';
COMMENT ON COLUMN ACDNT.RPT_DTM       IS '보고일시';
COMMENT ON COLUMN ACDNT.RSPNS_ORG_SN  IS '책임조직순번 (담당 기관)';
COMMENT ON COLUMN ACDNT.SVRT_CD       IS '심각도코드 (DANGER:위험, ALERT:경계, CAUTION:주의, INTEREST:관심)';
COMMENT ON COLUMN ACDNT.RGTR_ID       IS '등록자아이디';
COMMENT ON COLUMN ACDNT.REG_DTM       IS '등록일시';
COMMENT ON COLUMN ACDNT.MDFCN_DTM     IS '수정일시';


-- ============================================================
-- 5. 유출정보 (SPIL_DATA)
-- ============================================================
CREATE TABLE SPIL_DATA (
  SPIL_DATA_SN    SERIAL        NOT NULL,  -- 유출정보순번
  ACDNT_SN        INTEGER       NOT NULL,  -- 사고순번
  OIL_TP_CD       VARCHAR(50)   NOT NULL,  -- 유종코드
  SPIL_QTY        NUMERIC(14,10),          -- 유출량
  SPIL_UNIT_CD    VARCHAR(10)   DEFAULT 'KL', -- 유출단위코드
  SPIL_TP_CD      VARCHAR(20),             -- 유출유형코드
  SPIL_LOC_GEOM   GEOMETRY(Point, 4326),   -- 유출위치지오메트리
  FCST_HR         INTEGER,                 -- 예측시간
  REG_DTM         TIMESTAMPTZ   NOT NULL DEFAULT NOW(), -- 등록일시
  IMG_RSLT_DATA     JSONB,                   -- 이미지 분석 결과 (2024-06 추가)
  CONSTRAINT PK_SPIL_DATA PRIMARY KEY (SPIL_DATA_SN),
  CONSTRAINT FK_SPIL_ACDNT FOREIGN KEY (ACDNT_SN) REFERENCES ACDNT(ACDNT_SN) ON DELETE CASCADE
);

COMMENT ON TABLE  SPIL_DATA IS '유출정보';
COMMENT ON COLUMN SPIL_DATA.SPIL_DATA_SN  IS '유출정보순번';
COMMENT ON COLUMN SPIL_DATA.ACDNT_SN      IS '사고순번 (사고 참조)';
COMMENT ON COLUMN SPIL_DATA.OIL_TP_CD     IS '유종코드 (OIL_TP: 벙커C유, 경유, 원유 등)';
COMMENT ON COLUMN SPIL_DATA.SPIL_QTY      IS '유출량';
COMMENT ON COLUMN SPIL_DATA.SPIL_UNIT_CD  IS '유출단위코드 (KL:킬로리터, L:리터, BBL:배럴)';
COMMENT ON COLUMN SPIL_DATA.SPIL_TP_CD    IS '유출유형코드 (SPIL_TP: 연속유출, 순간유출 등)';
COMMENT ON COLUMN SPIL_DATA.SPIL_LOC_GEOM IS '유출위치지오메트리 (EPSG:4326 Point)';
COMMENT ON COLUMN SPIL_DATA.FCST_HR       IS '예측시간 (시간 단위)';
COMMENT ON COLUMN SPIL_DATA.REG_DTM       IS '등록일시';


-- ============================================================
-- 6. 예측실행 (PRED_EXEC)
-- ============================================================
CREATE TABLE PRED_EXEC (
  PRED_EXEC_SN    SERIAL        NOT NULL,  -- 예측실행순번
  SPIL_DATA_SN    INTEGER,                 -- 유출정보순번 (NULL 허용 — 사고 미연결 단독 실행 대응)  
  ACDNT_SN        INTEGER       NOT NULL,  -- 사고순번 (사고 참조, 유출정보 미연결 시에도 사고는 필수)
  ALGO_CD         VARCHAR(20)   NOT NULL,  -- 알고리즘코드
  EXEC_STTS_CD    VARCHAR(20)   NOT NULL DEFAULT 'PENDING', -- 실행상태코드
  BGNG_DTM        TIMESTAMPTZ,             -- 시작일시
  CMPL_DTM        TIMESTAMPTZ,             -- 완료일시
  REQD_SEC        INTEGER,                 -- 소요시간초
  RSLT_DATA       JSONB,                   -- 결과데이터
  ERR_MSG         TEXT,                    -- 오류메시지
  EXEC_NM         VARCHAR(100),            -- 실행명
  CONSTRAINT PK_PRED_EXEC PRIMARY KEY (PRED_EXEC_SN),
  CONSTRAINT FK_PRED_SPIL FOREIGN KEY (SPIL_DATA_SN) REFERENCES SPIL_DATA(SPIL_DATA_SN) ON DELETE CASCADE,
  CONSTRAINT CK_PRED_STTS CHECK (EXEC_STTS_CD IN ('PENDING','RUNNING','COMPLETED','FAILED'))
);

COMMENT ON TABLE  PRED_EXEC IS '예측실행';
COMMENT ON COLUMN PRED_EXEC.PRED_EXEC_SN IS '예측실행순번';
COMMENT ON COLUMN PRED_EXEC.SPIL_DATA_SN IS '유출정보순번 (FK → SPIL_DATA, NULL 허용)';
COMMENT ON COLUMN PRED_EXEC.ACDNT_SN     IS '사고순번 (사고 참조)';
COMMENT ON COLUMN PRED_EXEC.ALGO_CD      IS '알고리즘코드 (ALGO: GNOME, OSCAR, OPENDRIFT 등)';
COMMENT ON COLUMN PRED_EXEC.EXEC_STTS_CD IS '실행상태코드 (PENDING:대기, RUNNING:실행중, COMPLETED:완료, FAILED:실패)';
COMMENT ON COLUMN PRED_EXEC.BGNG_DTM     IS '시작일시';
COMMENT ON COLUMN PRED_EXEC.CMPL_DTM     IS '완료일시';
COMMENT ON COLUMN PRED_EXEC.REQD_SEC     IS '소요시간초 (실행 소요 시간, 초 단위)';
COMMENT ON COLUMN PRED_EXEC.RSLT_DATA    IS '결과데이터 (JSON 형식 예측 결과)';
COMMENT ON COLUMN PRED_EXEC.ERR_MSG      IS '오류메시지';
COMMENT ON COLUMN PRED_EXEC.EXEC_NM      IS '실행명 (EXPC_{timestamp} 형식, OpenDrift 연동용)';


-- ============================================================
-- 7. 오일펜스배치 (BOOM_LINE)
-- ============================================================
CREATE TABLE BOOM_LINE (
  BOOM_SN         SERIAL        NOT NULL,  -- 오일펜스순번
  ACDNT_SN        INTEGER       NOT NULL,  -- 사고순번
  BOOM_NM         VARCHAR(100)  NOT NULL,  -- 오일펜스명
  PRIORT_CD       VARCHAR(20),             -- 우선순위코드
  LEN_M           NUMERIC(10,2),           -- 길이미터
  LINE_GEOM       GEOMETRY(LineString, 4326), -- 라인지오메트리
  DPLY_STTS_CD    VARCHAR(20)   NOT NULL DEFAULT 'PLANNED', -- 배치상태코드
  EFCNC_PCT       NUMERIC(5,2),            -- 효율퍼센트
  REG_DTM         TIMESTAMPTZ   NOT NULL DEFAULT NOW(), -- 등록일시
  MDFCN_DTM       TIMESTAMPTZ   NOT NULL DEFAULT NOW(), -- 수정일시
  CONSTRAINT PK_BOOM_LINE PRIMARY KEY (BOOM_SN),
  CONSTRAINT FK_BOOM_ACDNT FOREIGN KEY (ACDNT_SN) REFERENCES ACDNT(ACDNT_SN) ON DELETE CASCADE,
  CONSTRAINT CK_BOOM_PRIORT CHECK (PRIORT_CD IN ('CRITICAL','HIGH','MEDIUM','LOW')),
  CONSTRAINT CK_BOOM_STTS CHECK (DPLY_STTS_CD IN ('PLANNED','DEPLOYING','DEPLOYED','REMOVED'))
);

COMMENT ON TABLE  BOOM_LINE IS '오일펜스배치';
COMMENT ON COLUMN BOOM_LINE.BOOM_SN      IS '오일펜스순번';
COMMENT ON COLUMN BOOM_LINE.ACDNT_SN     IS '사고순번 (사고 참조)';
COMMENT ON COLUMN BOOM_LINE.BOOM_NM      IS '오일펜스명';
COMMENT ON COLUMN BOOM_LINE.PRIORT_CD    IS '우선순위코드 (CRITICAL:긴급, HIGH:높음, MEDIUM:보통, LOW:낮음)';
COMMENT ON COLUMN BOOM_LINE.LEN_M        IS '길이미터 (오일펜스 총 길이, 미터)';
COMMENT ON COLUMN BOOM_LINE.LINE_GEOM    IS '라인지오메트리 (EPSG:4326 LineString)';
COMMENT ON COLUMN BOOM_LINE.DPLY_STTS_CD IS '배치상태코드 (PLANNED:계획, DEPLOYING:배치중, DEPLOYED:배치완료, REMOVED:회수)';
COMMENT ON COLUMN BOOM_LINE.EFCNC_PCT    IS '효율퍼센트 (방제 효율, %)';
COMMENT ON COLUMN BOOM_LINE.REG_DTM      IS '등록일시';
COMMENT ON COLUMN BOOM_LINE.MDFCN_DTM    IS '수정일시';


-- ============================================================
-- 8. 해안조사구역 (CST_SRVY_ZONE)
-- ============================================================
CREATE TABLE CST_SRVY_ZONE (
  CST_SRVY_ZONE_SN  SERIAL       NOT NULL,  -- 해안조사구역순번
  ZONE_CD           VARCHAR(20)  NOT NULL,  -- 구역코드
  ZONE_NM           VARCHAR(100) NOT NULL,  -- 구역명
  JRSD_ORG_SN       INTEGER,               -- 관할조직순번
  ZONE_DC           VARCHAR(500),           -- 구역설명
  REG_DTM           TIMESTAMPTZ  NOT NULL DEFAULT NOW(), -- 등록일시
  CONSTRAINT PK_CST_SRVY_ZONE PRIMARY KEY (CST_SRVY_ZONE_SN),
  CONSTRAINT UK_ZONE_CD UNIQUE (ZONE_CD),
  CONSTRAINT FK_ZONE_ORG FOREIGN KEY (JRSD_ORG_SN) REFERENCES ORG(ORG_SN)
);

COMMENT ON TABLE  CST_SRVY_ZONE IS '해안조사구역';
COMMENT ON COLUMN CST_SRVY_ZONE.CST_SRVY_ZONE_SN IS '해안조사구역순번';
COMMENT ON COLUMN CST_SRVY_ZONE.ZONE_CD           IS '구역코드 (예: JJAW, JJAN 등)';
COMMENT ON COLUMN CST_SRVY_ZONE.ZONE_NM           IS '구역명 (예: 제주시 서부, 서귀포시 동부 등)';
COMMENT ON COLUMN CST_SRVY_ZONE.JRSD_ORG_SN       IS '관할조직순번 (관할 해경 기관)';
COMMENT ON COLUMN CST_SRVY_ZONE.ZONE_DC           IS '구역설명';
COMMENT ON COLUMN CST_SRVY_ZONE.REG_DTM           IS '등록일시';


-- ============================================================
-- 9. 해안구간 (CST_SECT)
-- ============================================================
CREATE TABLE CST_SECT (
  CST_SECT_SN       SERIAL          NOT NULL,  -- 해안구간순번
  CST_SRVY_ZONE_SN  INTEGER         NOT NULL,  -- 해안조사구역순번
  SECT_CD           VARCHAR(20)     NOT NULL,  -- 구간코드
  SECT_NM           VARCHAR(100),              -- 구간명
  CST_TP_CD         VARCHAR(20),               -- 해안유형코드
  LEN_M             NUMERIC(10,2),             -- 길이미터
  SNSTVT_CD         VARCHAR(10),               -- 민감도코드
  SRVY_STTS_CD      VARCHAR(20)     DEFAULT 'PENDING',  -- 조사상태코드
  BGNG_LAT          NUMERIC(12,10),            -- 시작위도
  BGNG_LON          NUMERIC(13,10),            -- 시작경도
  END_LAT           NUMERIC(12,10),            -- 종료위도
  END_LON           NUMERIC(13,10),            -- 종료경도
  BGNG_LOC_GEOM     GEOMETRY(Point, 4326),     -- 시작위치지오메트리
  END_LOC_GEOM      GEOMETRY(Point, 4326),     -- 종료위치지오메트리
  REG_DTM           TIMESTAMPTZ     NOT NULL DEFAULT NOW(), -- 등록일시
  MDFCN_DTM         TIMESTAMPTZ     NOT NULL DEFAULT NOW(), -- 수정일시
  CONSTRAINT PK_CST_SECT PRIMARY KEY (CST_SECT_SN),
  CONSTRAINT UK_SECT_CD UNIQUE (SECT_CD),
  CONSTRAINT FK_SECT_ZONE FOREIGN KEY (CST_SRVY_ZONE_SN) REFERENCES CST_SRVY_ZONE(CST_SRVY_ZONE_SN)
);

COMMENT ON TABLE  CST_SECT IS '해안구간';
COMMENT ON COLUMN CST_SECT.CST_SECT_SN       IS '해안구간순번';
COMMENT ON COLUMN CST_SECT.CST_SRVY_ZONE_SN  IS '해안조사구역순번 (구역 참조)';
COMMENT ON COLUMN CST_SECT.SECT_CD           IS '구간코드 (예: JJAW-1, JJAW-2 등)';
COMMENT ON COLUMN CST_SECT.SECT_NM           IS '구간명';
COMMENT ON COLUMN CST_SECT.CST_TP_CD        IS '해안유형코드 (CST_TP: 암반, 자갈, 모래, 혼합 등)';
COMMENT ON COLUMN CST_SECT.LEN_M            IS '길이미터 (해안구간 길이, 미터)';
COMMENT ON COLUMN CST_SECT.SNSTVT_CD        IS '민감도코드 (SNSTVT: HIGH, MEDIUM, LOW)';
COMMENT ON COLUMN CST_SECT.SRVY_STTS_CD     IS '조사상태코드 (PENDING:미조사, PROGRESS:진행중, COMPLETED:완료)';
COMMENT ON COLUMN CST_SECT.BGNG_LAT         IS '시작위도';
COMMENT ON COLUMN CST_SECT.BGNG_LON         IS '시작경도';
COMMENT ON COLUMN CST_SECT.END_LAT          IS '종료위도';
COMMENT ON COLUMN CST_SECT.END_LON          IS '종료경도';
COMMENT ON COLUMN CST_SECT.BGNG_LOC_GEOM    IS '시작위치지오메트리 (EPSG:4326 Point)';
COMMENT ON COLUMN CST_SECT.END_LOC_GEOM     IS '종료위치지오메트리 (EPSG:4326 Point)';
COMMENT ON COLUMN CST_SECT.REG_DTM          IS '등록일시';
COMMENT ON COLUMN CST_SECT.MDFCN_DTM        IS '수정일시';


-- ============================================================
-- 10. SCAT조사 (SCAT_SRVY)
-- ============================================================
CREATE TABLE SCAT_SRVY (
  SCAT_SRVY_SN      SERIAL        NOT NULL,  -- SCAT조사순번
  CST_SECT_SN       INTEGER       NOT NULL,  -- 해안구간순번
  ACDNT_SN          INTEGER,                 -- 사고순번
  SRVY_YMD          CHAR(8),                 -- 조사일자 (YYYYMMDD)
  SRVY_TP_CD        VARCHAR(20),             -- 조사유형코드
  SRVY_PHASE_CD     VARCHAR(20),             -- 조사단계코드
  POLUT_CD          VARCHAR(20),             -- 오염도코드
  SRVYR_ID          UUID,                    -- 조사자아이디
  RMK               VARCHAR(500),            -- 비고
  REG_DTM           TIMESTAMPTZ   NOT NULL DEFAULT NOW(), -- 등록일시
  CONSTRAINT PK_SCAT_SRVY PRIMARY KEY (SCAT_SRVY_SN),
  CONSTRAINT FK_SCAT_SECT FOREIGN KEY (CST_SECT_SN) REFERENCES CST_SECT(CST_SECT_SN),
  CONSTRAINT FK_SCAT_ACDNT FOREIGN KEY (ACDNT_SN) REFERENCES ACDNT(ACDNT_SN),
  CONSTRAINT FK_SCAT_SRVYR FOREIGN KEY (SRVYR_ID) REFERENCES USER_INFO(USER_ID)
);

COMMENT ON TABLE  SCAT_SRVY IS 'SCAT조사';
COMMENT ON COLUMN SCAT_SRVY.SCAT_SRVY_SN  IS 'SCAT조사순번';
COMMENT ON COLUMN SCAT_SRVY.CST_SECT_SN   IS '해안구간순번 (해안구간 참조)';
COMMENT ON COLUMN SCAT_SRVY.ACDNT_SN      IS '사고순번 (관련 사고 참조)';
COMMENT ON COLUMN SCAT_SRVY.SRVY_YMD      IS '조사일자 (YYYYMMDD 저장형식)';
COMMENT ON COLUMN SCAT_SRVY.SRVY_TP_CD    IS '조사유형코드 (SRVY_TP: Pre-SCAT, SCAT, Post-SCAT)';
COMMENT ON COLUMN SCAT_SRVY.SRVY_PHASE_CD IS '조사단계코드 (SRVY_PHASE: 1차, 2차, 3차 등)';
COMMENT ON COLUMN SCAT_SRVY.POLUT_CD      IS '오염도코드 (POLUT: HEAVY, MODERATE, LIGHT, CLEAN)';
COMMENT ON COLUMN SCAT_SRVY.SRVYR_ID      IS '조사자아이디';
COMMENT ON COLUMN SCAT_SRVY.RMK           IS '비고';
COMMENT ON COLUMN SCAT_SRVY.REG_DTM       IS '등록일시';


-- ============================================================
-- 11. SCAT조사사진 (SCAT_SRVY_PHOTO)
-- ============================================================
CREATE TABLE SCAT_SRVY_PHOTO (
  SCAT_PHOTO_SN     SERIAL        NOT NULL,  -- SCAT조사사진순번
  SCAT_SRVY_SN      INTEGER       NOT NULL,  -- SCAT조사순번
  PHOTO_FILE_PATH   VARCHAR(500)  NOT NULL,  -- 사진파일경로
  PHOTO_DC          VARCHAR(200),            -- 사진설명
  TAKNG_DTM         TIMESTAMPTZ,             -- 촬영일시
  SORT_ORD          INTEGER       DEFAULT 0, -- 정렬순서
  REG_DTM           TIMESTAMPTZ   NOT NULL DEFAULT NOW(), -- 등록일시
  CONSTRAINT PK_SCAT_PHOTO PRIMARY KEY (SCAT_PHOTO_SN),
  CONSTRAINT FK_PHOTO_SRVY FOREIGN KEY (SCAT_SRVY_SN) REFERENCES SCAT_SRVY(SCAT_SRVY_SN) ON DELETE CASCADE
);

COMMENT ON TABLE  SCAT_SRVY_PHOTO IS 'SCAT조사사진';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.SCAT_PHOTO_SN   IS 'SCAT조사사진순번';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.SCAT_SRVY_SN    IS 'SCAT조사순번 (SCAT조사 참조)';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.PHOTO_FILE_PATH  IS '사진파일경로';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.PHOTO_DC         IS '사진설명';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.TAKNG_DTM        IS '촬영일시';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.SORT_ORD         IS '정렬순서';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.REG_DTM          IS '등록일시';


-- ============================================================
-- 12. HNS물질정보 (HNS_SBST)
-- ============================================================
CREATE TABLE HNS_SBST (
  HNS_SBST_SN      SERIAL        NOT NULL,  -- HNS물질순번
  SBST_NM           VARCHAR(200)  NOT NULL,  -- 물질명
  SBST_ENG_NM       VARCHAR(200),            -- 물질영문명
  CAS_NO            VARCHAR(20),             -- CAS번호
  UN_NO             VARCHAR(10),             -- UN번호
  RISK_GRD_CD       VARCHAR(10),             -- 위험등급코드
  PHYS_STATE_CD     VARCHAR(20),             -- 물리상태코드
  DNST              NUMERIC(10,4),           -- 밀도
  VAPOR_PRSR        NUMERIC(12,4),           -- 증기압
  WATER_SLBLT_CD    VARCHAR(20),             -- 수용성코드
  TOXICITY_CD       VARCHAR(20),             -- 독성코드
  SBST_DC           TEXT,                    -- 물질설명
  REG_DTM           TIMESTAMPTZ   NOT NULL DEFAULT NOW(), -- 등록일시
  CONSTRAINT PK_HNS_SBST PRIMARY KEY (HNS_SBST_SN)
);

COMMENT ON TABLE  HNS_SBST IS 'HNS물질정보';
COMMENT ON COLUMN HNS_SBST.HNS_SBST_SN    IS 'HNS물질순번';
COMMENT ON COLUMN HNS_SBST.SBST_NM        IS '물질명 (한글명)';
COMMENT ON COLUMN HNS_SBST.SBST_ENG_NM    IS '물질영문명';
COMMENT ON COLUMN HNS_SBST.CAS_NO         IS 'CAS번호 (화학물질등록번호)';
COMMENT ON COLUMN HNS_SBST.UN_NO          IS 'UN번호 (위험물 식별번호)';
COMMENT ON COLUMN HNS_SBST.RISK_GRD_CD    IS '위험등급코드';
COMMENT ON COLUMN HNS_SBST.PHYS_STATE_CD  IS '물리상태코드 (SOLID, LIQUID, GAS)';
COMMENT ON COLUMN HNS_SBST.DNST           IS '밀도 (g/cm³)';
COMMENT ON COLUMN HNS_SBST.VAPOR_PRSR     IS '증기압 (mmHg)';
COMMENT ON COLUMN HNS_SBST.WATER_SLBLT_CD IS '수용성코드 (SOLUBLE, PARTIAL, INSOLUBLE)';
COMMENT ON COLUMN HNS_SBST.TOXICITY_CD    IS '독성코드 (HIGH, MEDIUM, LOW)';
COMMENT ON COLUMN HNS_SBST.SBST_DC        IS '물질설명';
COMMENT ON COLUMN HNS_SBST.REG_DTM        IS '등록일시';


-- ============================================================
-- 13. 인덱스
-- ============================================================

-- 공간 인덱스 (GIST)
CREATE INDEX IDX_ACDNT_LOC_GEOM      ON ACDNT        USING GIST(LOC_GEOM);
CREATE INDEX IDX_SPIL_LOC_GEOM       ON SPIL_DATA    USING GIST(SPIL_LOC_GEOM);
CREATE INDEX IDX_BOOM_LINE_GEOM      ON BOOM_LINE    USING GIST(LINE_GEOM);
CREATE INDEX IDX_SECT_BGNG_GEOM      ON CST_SECT     USING GIST(BGNG_LOC_GEOM);
CREATE INDEX IDX_SECT_END_GEOM       ON CST_SECT     USING GIST(END_LOC_GEOM);

-- 상태 코드 인덱스
CREATE INDEX IDX_ACDNT_STTS          ON ACDNT        (ACDNT_STTS_CD);
CREATE INDEX IDX_PRED_STTS           ON PRED_EXEC    (EXEC_STTS_CD);
CREATE INDEX IDX_BOOM_STTS           ON BOOM_LINE    (DPLY_STTS_CD);
CREATE INDEX IDX_SECT_SRVY_STTS      ON CST_SECT     (SRVY_STTS_CD);

-- 외래키 인덱스
CREATE INDEX IDX_USER_ORG_SN         ON USER_INFO    (ORG_SN);
CREATE INDEX IDX_ACDNT_RSPNS_ORG     ON ACDNT        (RSPNS_ORG_SN);
CREATE INDEX IDX_SPIL_ACDNT_SN       ON SPIL_DATA    (ACDNT_SN);
CREATE INDEX IDX_PRED_SPIL_SN        ON PRED_EXEC    (SPIL_DATA_SN);
CREATE INDEX IDX_BOOM_ACDNT_SN       ON BOOM_LINE    (ACDNT_SN);
CREATE INDEX IDX_SECT_ZONE_SN        ON CST_SECT     (CST_SRVY_ZONE_SN);
CREATE INDEX IDX_SCAT_SECT_SN        ON SCAT_SRVY    (CST_SECT_SN);
CREATE INDEX IDX_SCAT_ACDNT_SN       ON SCAT_SRVY    (ACDNT_SN);
CREATE INDEX IDX_PHOTO_SRVY_SN       ON SCAT_SRVY_PHOTO (SCAT_SRVY_SN);

-- 코드 테이블 인덱스
CREATE INDEX IDX_CMN_CD_GRP_USE      ON CMN_CD_GRP   (USE_YN);
CREATE INDEX IDX_CMN_CD_USE          ON CMN_CD        (USE_YN);

-- 텍스트 검색 인덱스
CREATE INDEX IDX_ACDNT_NM_TRGM       ON ACDNT        USING GIN(ACDNT_NM gin_trgm_ops);
CREATE INDEX IDX_HNS_SBST_NM_TRGM    ON HNS_SBST     USING GIN(SBST_NM gin_trgm_ops);


-- ============================================================
-- 14. 공통코드 데이터
-- ============================================================

-- 조직유형 (ORG_TP)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('ORG_TP', '조직유형', '조직의 유형을 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('ORG_TP', 'HEADQUARTERS', '본청', 1),
('ORG_TP', 'REGIONAL',     '지방청', 2),
('ORG_TP', 'STATION',      '해양경찰서', 3),
('ORG_TP', 'AGENCY',       '유관기관', 4);

-- 사용자역할 (USER_ROLE)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('USER_ROLE', '사용자역할', '사용자의 시스템 역할을 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('USER_ROLE', 'ADMIN',   '관리자', 1),
('USER_ROLE', 'MANAGER', '운영자', 2),
('USER_ROLE', 'USER',    '일반사용자', 3);

-- 사고유형 (ACDNT_TP)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('ACDNT_TP', '사고유형', '해양사고의 유형을 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('ACDNT_TP', 'COLLISION',  '충돌', 1),
('ACDNT_TP', 'GROUNDING',  '좌초', 2),
('ACDNT_TP', 'SINKING',    '침몰', 3),
('ACDNT_TP', 'LEAK',       '누출', 4),
('ACDNT_TP', 'EXPLOSION',  '폭발', 5),
('ACDNT_TP', 'ETC',        '기타', 99);

-- 사고상태 (ACDNT_STTS)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('ACDNT_STTS', '사고상태', '사고의 진행 상태를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('ACDNT_STTS', 'ACTIVE',     '진행중', 1),
('ACDNT_STTS', 'MONITORING', '감시중', 2),
('ACDNT_STTS', 'CLOSED',     '종료', 3);

-- 심각도 (SVRT)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SVRT', '심각도', '사고의 심각도를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SVRT', 'DANGER',   '위험', 1),
('SVRT', 'ALERT',    '경계', 2),
('SVRT', 'CAUTION',  '주의', 3),
('SVRT', 'INTEREST', '관심', 4);

-- 유종 (OIL_TP)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('OIL_TP', '유종', '유출유의 종류를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('OIL_TP', 'CRUDE',    '원유', 1),
('OIL_TP', 'BUNKER_C', '벙커C유', 2),
('OIL_TP', 'DIESEL',   '경유', 3),
('OIL_TP', 'GASOLINE', '휘발유', 4),
('OIL_TP', 'KEROSENE', '등유', 5),
('OIL_TP', 'LUBE',     '윤활유', 6),
('OIL_TP', 'ETC',      '기타', 99);

-- 유출단위 (SPIL_UNIT)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SPIL_UNIT', '유출단위', '유출량의 측정 단위를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SPIL_UNIT', 'KL',  '킬로리터', 1),
('SPIL_UNIT', 'L',   '리터', 2),
('SPIL_UNIT', 'BBL', '배럴', 3),
('SPIL_UNIT', 'TON', '톤', 4);

-- 유출유형 (SPIL_TP)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SPIL_TP', '유출유형', '유출의 형태를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SPIL_TP', 'CONTINUOUS',  '연속유출', 1),
('SPIL_TP', 'INSTANTANEOUS','순간유출', 2);

-- 예측알고리즘 (ALGO)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('ALGO', '예측알고리즘', '유출 확산 예측에 사용되는 알고리즘 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('ALGO', 'GNOME',   'GNOME 모델', 1),
('ALGO', 'OSCAR',   'OSCAR 모델', 2),
('ALGO', 'MOHID',   'MOHID 모델', 3);

-- 실행상태 (EXEC_STTS)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('EXEC_STTS', '실행상태', '예측 실행의 상태를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('EXEC_STTS', 'PENDING',   '대기', 1),
('EXEC_STTS', 'RUNNING',   '실행중', 2),
('EXEC_STTS', 'COMPLETED', '완료', 3),
('EXEC_STTS', 'FAILED',    '실패', 4);

-- 오일펜스우선순위 (BOOM_PRIORT)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('BOOM_PRIORT', '오일펜스우선순위', '오일펜스 배치 우선순위를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('BOOM_PRIORT', 'CRITICAL', '긴급', 1),
('BOOM_PRIORT', 'HIGH',     '높음', 2),
('BOOM_PRIORT', 'MEDIUM',   '보통', 3),
('BOOM_PRIORT', 'LOW',      '낮음', 4);

-- 오일펜스배치상태 (DPLY_STTS)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('DPLY_STTS', '배치상태', '오일펜스의 배치 상태를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('DPLY_STTS', 'PLANNED',   '계획', 1),
('DPLY_STTS', 'DEPLOYING', '배치중', 2),
('DPLY_STTS', 'DEPLOYED',  '배치완료', 3),
('DPLY_STTS', 'REMOVED',   '회수', 4);

-- 해안유형 (CST_TP)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('CST_TP', '해안유형', '해안의 지형 유형을 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('CST_TP', 'ROCK',     '암반해안', 1),
('CST_TP', 'GRAVEL',   '자갈해안', 2),
('CST_TP', 'SAND',     '모래해안', 3),
('CST_TP', 'MUD',      '갯벌', 4),
('CST_TP', 'MIXED',    '혼합해안', 5),
('CST_TP', 'SEAWALL',  '인공구조물', 6),
('CST_TP', 'TETRAPOD', '테트라포드', 7);

-- 민감도 (SNSTVT)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SNSTVT', '민감도', '해안구간의 환경 민감도를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SNSTVT', 'HIGH',   '고', 1),
('SNSTVT', 'MEDIUM', '중', 2),
('SNSTVT', 'LOW',    '저', 3);

-- 조사상태 (SRVY_STTS)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SRVY_STTS', '조사상태', '해안구간 조사의 진행 상태를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SRVY_STTS', 'PENDING',   '미조사', 1),
('SRVY_STTS', 'PROGRESS',  '진행중', 2),
('SRVY_STTS', 'COMPLETED', '완료', 3);

-- 조사유형 (SRVY_TP)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SRVY_TP', '조사유형', 'SCAT 조사의 유형을 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SRVY_TP', 'PRE_SCAT',  'Pre-SCAT', 1),
('SRVY_TP', 'SCAT',      'SCAT', 2),
('SRVY_TP', 'POST_SCAT', 'Post-SCAT', 3);

-- 조사단계 (SRVY_PHASE)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SRVY_PHASE', '조사단계', 'SCAT 조사의 단계를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SRVY_PHASE', 'PHASE_1', '1차 조사', 1),
('SRVY_PHASE', 'PHASE_2', '2차 조사', 2),
('SRVY_PHASE', 'PHASE_3', '3차 조사', 3);

-- 오염도 (POLUT)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('POLUT', '오염도', '해안구간의 오염 정도를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('POLUT', 'HEAVY',    '심각', 1),
('POLUT', 'MODERATE', '보통', 2),
('POLUT', 'LIGHT',    '경미', 3),
('POLUT', 'CLEAN',    '깨끗', 4);

-- 물리상태 (PHYS_STATE)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('PHYS_STATE', '물리상태', '화학물질의 물리적 상태를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('PHYS_STATE', 'SOLID',  '고체', 1),
('PHYS_STATE', 'LIQUID', '액체', 2),
('PHYS_STATE', 'GAS',    '기체', 3);

-- 수용성 (WATER_SLBLT)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('WATER_SLBLT', '수용성', '화학물질의 수용성 정도를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('WATER_SLBLT', 'SOLUBLE',   '수용성', 1),
('WATER_SLBLT', 'PARTIAL',   '부분용해', 2),
('WATER_SLBLT', 'INSOLUBLE', '불용성', 3);

-- 독성 (TOXICITY)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('TOXICITY', '독성', '화학물질의 독성 수준을 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('TOXICITY', 'HIGH',   '고독성', 1),
('TOXICITY', 'MEDIUM', '중독성', 2),
('TOXICITY', 'LOW',    '저독성', 3);


-- ============================================================
-- 15. 샘플 데이터
-- ============================================================

-- 조직
INSERT INTO ORG (ORG_NM, ORG_ABBR_NM, ORG_TP_CD) VALUES
('해양경찰청',           '해경청',    'HEADQUARTERS'),
('남해지방해양경찰청',    '남해청',    'REGIONAL'),
('제주지방해양경찰청',    '제주청',    'REGIONAL'),
('여수해양경찰서',       '여수서',    'STATION'),
('서귀포해양경찰서',     '서귀포서',   'STATION'),
('제주해양경찰서',       '제주서',    'STATION');

-- 상위조직 설정
UPDATE ORG SET UPPER_ORG_SN = 1 WHERE ORG_SN IN (2, 3);
UPDATE ORG SET UPPER_ORG_SN = 2 WHERE ORG_SN = 4;
UPDATE ORG SET UPPER_ORG_SN = 3 WHERE ORG_SN IN (5, 6);

-- 관리자 (비밀번호: admin1234)
INSERT INTO USER_INFO (USER_ACNT, PSWD_HASH, USER_NM, RNKP_NM, ORG_SN, ROLE_CD) VALUES
('admin', '$2b$10$rN3qJ9qZ5yH.KfxYvYvW0.VxJ8K5vN8qJ9qZ5yH.KfxYvYvW0.VxJ8', '관리자', '경정', 1, 'ADMIN');

-- 샘플 사고 (여수 앞바다)
INSERT INTO ACDNT (ACDNT_CD, ACDNT_NM, ACDNT_TP_CD, LOC_GEOM, LOC_DC, OCCRN_DTM, RSPNS_ORG_SN, SVRT_CD) VALUES
('INC-2025-0042', '여수 앞바다 유조선 충돌', 'COLLISION',
 ST_SetSRID(ST_MakePoint(127.8, 34.5), 4326),
 '여수 돌산 남방 5NM', '2025-02-10 06:30:00+09', 4, 'DANGER');


-- ============================================================
-- 데이터베이스 코멘트
-- ============================================================
COMMENT ON DATABASE wing IS 'WING 해양환경 위기대응 통합시스템 - 공공데이터베이스 표준화 관리 매뉴얼(2021.06) 적용';
