-- ============================================================================
-- 제품 태깅 시스템 스키마 (Product Tagging System)
-- 바코드 기반 AI 자동 태깅, 온톨로지 구축, 질병 코드 매핑
-- ============================================================================

-- ============================================================================
-- 1. 제품 마스터 (Product Master)
-- ============================================================================
CREATE TABLE IF NOT EXISTS product_master (
    barcode TEXT PRIMARY KEY,              -- 제품 바코드 (8806436016712)
    product_name TEXT NOT NULL,            -- 대표 제품명 (탁센캡슐)
    manufacturer TEXT,                     -- 제조사 (동아제약)

    -- 분류
    drug_classification TEXT,              -- 일반의약품, 전문의약품, 건강기능식품

    -- 성분 정보 (JSON)
    ingredients_json TEXT,                 -- [{"name": "나프록센", "amount": "250mg", "role": "주성분"}]

    -- AI 태그 (JSON 배열)
    tags_symptoms TEXT,                    -- ["생리통", "치통", "골관절염", "두통", "근육통"]
    tags_ingredients TEXT,                 -- ["나프록센 250mg", "비스테로이드성 소염진통제"]
    tags_effects TEXT,                     -- ["진통", "소염", "해열"]

    -- 메타데이터
    source_url TEXT,                       -- 크롤링한 URL (약학정보원, 식약처)
    last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    is_verified BOOLEAN DEFAULT 0,         -- 약사 검증 여부
    notes TEXT                             -- 약사 메모
);

-- 인덱스
CREATE INDEX IF NOT EXISTS idx_product_name ON product_master(product_name);
CREATE INDEX IF NOT EXISTS idx_manufacturer ON product_master(manufacturer);
CREATE INDEX IF NOT EXISTS idx_drug_classification ON product_master(drug_classification);
CREATE INDEX IF NOT EXISTS idx_last_updated ON product_master(last_updated);


-- ============================================================================
-- 2. 제품 카테고리 마스터 (Product Categories)
-- ============================================================================
CREATE TABLE IF NOT EXISTS product_categories (
    category_id INTEGER PRIMARY KEY AUTOINCREMENT,
    category_name TEXT UNIQUE NOT NULL,    -- 진통제, 소화제, 비타민 등
    parent_category TEXT,                  -- 상위 카테고리 (옵션)
    description TEXT,                      -- 카테고리 설명
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 인덱스
CREATE INDEX IF NOT EXISTS idx_category_name ON product_categories(category_name);
CREATE INDEX IF NOT EXISTS idx_parent_category ON product_categories(parent_category);


-- ============================================================================
-- 3. 제품-카테고리 매핑 (다대다 관계)
-- ============================================================================
CREATE TABLE IF NOT EXISTS product_category_mapping (
    barcode TEXT NOT NULL,                 -- 제품 바코드
    category_name TEXT NOT NULL,           -- 카테고리명
    relevance_score REAL DEFAULT 1.0,      -- 관련도 (0.0 ~ 1.0)
                                          -- 1.0 = 주 카테고리, 0.5 = 부 카테고리
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    PRIMARY KEY (barcode, category_name),
    FOREIGN KEY (barcode) REFERENCES product_master(barcode) ON DELETE CASCADE,
    FOREIGN KEY (category_name) REFERENCES product_categories(category_name) ON DELETE CASCADE
);

-- 인덱스
CREATE INDEX IF NOT EXISTS idx_mapping_barcode ON product_category_mapping(barcode);
CREATE INDEX IF NOT EXISTS idx_mapping_category ON product_category_mapping(category_name);
CREATE INDEX IF NOT EXISTS idx_mapping_score ON product_category_mapping(relevance_score);


-- ============================================================================
-- 4. 질병 코드 (ICD-10)
-- ============================================================================
CREATE TABLE IF NOT EXISTS disease_codes (
    icd_code TEXT PRIMARY KEY,             -- K30 (ICD-10 코드)
    disease_name TEXT NOT NULL,            -- 소화불량
    disease_category TEXT,                 -- 소화기질환
    description TEXT,                      -- 기능성 소화불량증
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 인덱스
CREATE INDEX IF NOT EXISTS idx_disease_name ON disease_codes(disease_name);
CREATE INDEX IF NOT EXISTS idx_disease_category ON disease_codes(disease_category);


-- ============================================================================
-- 5. 질병군 마스터
-- ============================================================================
CREATE TABLE IF NOT EXISTS disease_categories (
    category_id INTEGER PRIMARY KEY AUTOINCREMENT,
    category_name TEXT UNIQUE NOT NULL,    -- 소화기질환, 근골격계질환 등
    parent_category TEXT,                  -- 상위 질병군 (옵션)
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 인덱스
CREATE INDEX IF NOT EXISTS idx_dis_category_name ON disease_categories(category_name);


-- ============================================================================
-- 6. 질병군 - 제품군 매핑
-- ============================================================================
CREATE TABLE IF NOT EXISTS disease_product_mapping (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    disease_category TEXT NOT NULL,        -- 소화기질환
    product_category TEXT NOT NULL,        -- 소화제
    relevance_score REAL DEFAULT 1.0,      -- 관련도 (0.0 ~ 1.0)
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    FOREIGN KEY (disease_category) REFERENCES disease_categories(category_name) ON DELETE CASCADE,
    FOREIGN KEY (product_category) REFERENCES product_categories(category_name) ON DELETE CASCADE,
    UNIQUE(disease_category, product_category)
);

-- 인덱스
CREATE INDEX IF NOT EXISTS idx_dis_prod_disease ON disease_product_mapping(disease_category);
CREATE INDEX IF NOT EXISTS idx_dis_prod_product ON disease_product_mapping(product_category);


-- ============================================================================
-- 초기 데이터: 제품 카테고리
-- ============================================================================
INSERT OR IGNORE INTO product_categories (category_name, description) VALUES
-- 진통/소염
('진통제', '통증 완화'),
('소염제', '염증 완화'),
('해열제', '발열 완화'),
('진통소염제', '통증과 염증 동시 완화'),

-- 소화기
('소화제', '소화 기능 개선'),
('위장약', '위장 보호 및 치료'),
('제산제', '위산 중화'),
('정장제', '장 기능 개선'),

-- 호흡기
('감기약', '감기 증상 완화'),
('기침약', '기침 완화'),
('거담제', '가래 배출'),

-- 비타민/영양
('복합비타민', '종합 비타민'),
('간영양제', '간 기능 개선'),
('피로회복제', '피로 회복'),
('칼슘제', '칼슘 보충'),
('철분제', '철분 보충'),

-- 외용
('파스', '외용 진통소염'),
('안약', '안과 질환'),
('연고', '피부 외용'),

-- 기타
('항히스타민제', '알레르기 완화'),
('수면제', '수면 유도'),
('변비약', '배변 활동 개선');


-- ============================================================================
-- 초기 데이터: 질병 카테고리
-- ============================================================================
INSERT OR IGNORE INTO disease_categories (category_name, description) VALUES
('소화기질환', '소화기계 관련 질환'),
('근골격계질환', '관절, 근육 관련 질환'),
('신경계질환', '신경계 관련 질환'),
('호흡기질환', '호흡기계 관련 질환'),
('순환기질환', '심혈관계 관련 질환'),
('피부질환', '피부 관련 질환');


-- ============================================================================
-- 초기 데이터: 주요 질병 코드 (ICD-10)
-- ============================================================================
INSERT OR IGNORE INTO disease_codes (icd_code, disease_name, disease_category, description) VALUES
-- 소화기
('K30', '소화불량', '소화기질환', '기능성 소화불량증'),
('K29', '위염', '소화기질환', '만성 위염'),
('K21', '역류성식도염', '소화기질환', 'GERD'),
('K59', '변비', '소화기질환', '기능성 변비'),

-- 근골격계
('M25', '관절통', '근골격계질환', '관절 통증'),
('M79', '근육통', '근골격계질환', '근육 통증'),
('M54', '요통', '근골격계질환', '허리 통증'),

-- 신경계
('R51', '두통', '신경계질환', '긴장성 두통'),
('G43', '편두통', '신경계질환', '편두통'),

-- 호흡기
('J00', '급성비인두염', '호흡기질환', '감기'),
('J06', '급성상기도감염', '호흡기질환', '상기도 감염'),

-- 기타
('N94', '생리통', '여성질환', '월경통');


-- ============================================================================
-- 초기 데이터: 질병군 - 제품군 매핑
-- ============================================================================
INSERT OR IGNORE INTO disease_product_mapping (disease_category, product_category, relevance_score) VALUES
-- 소화기질환
('소화기질환', '소화제', 1.0),
('소화기질환', '위장약', 0.9),
('소화기질환', '제산제', 0.8),
('소화기질환', '정장제', 0.7),

-- 근골격계질환
('근골격계질환', '진통소염제', 1.0),
('근골격계질환', '파스', 0.8),
('근골격계질환', '진통제', 0.9),

-- 신경계질환
('신경계질환', '진통제', 1.0),
('신경계질환', '수면제', 0.5),

-- 호흡기질환
('호흡기질환', '감기약', 1.0),
('호흡기질환', '기침약', 0.9),
('호흡기질환', '거담제', 0.8);


-- ============================================================================
-- 뷰: 제품 상세 정보 (카테고리 포함)
-- ============================================================================
CREATE VIEW IF NOT EXISTS v_product_details AS
SELECT
    p.barcode,
    p.product_name,
    p.manufacturer,
    p.drug_classification,
    GROUP_CONCAT(m.category_name, ', ') as categories,
    AVG(m.relevance_score) as avg_relevance,
    p.tags_symptoms,
    p.tags_effects,
    p.is_verified,
    p.last_updated
FROM product_master p
LEFT JOIN product_category_mapping m ON p.barcode = m.barcode
GROUP BY p.barcode;


-- ============================================================================
-- 뷰: 질병별 추천 제품 카테고리
-- ============================================================================
CREATE VIEW IF NOT EXISTS v_disease_recommendations AS
SELECT
    d.icd_code,
    d.disease_name,
    d.disease_category,
    dp.product_category,
    dp.relevance_score
FROM disease_codes d
JOIN disease_product_mapping dp ON d.disease_category = dp.disease_category
ORDER BY d.icd_code, dp.relevance_score DESC;


-- ============================================================================
-- 완료
-- ============================================================================
-- 테이블 생성 완료
-- 초기 카테고리, 질병 코드, 매핑 데이터 삽입 완료
