-- TK-MP BOM 시스템 데이터베이스 스키마
-- 생성일: 2025.07.14

-- ================================
-- 1. 프로젝트 관리
-- ================================

-- 프로젝트 기본 정보
CREATE TABLE projects (
    id SERIAL PRIMARY KEY,
    
    -- 회사 공식 정보
    official_project_code VARCHAR(50) UNIQUE,           -- PP5-5701-DRYING (정식 코드)
    project_name VARCHAR(200) NOT NULL,
    client_name VARCHAR(100),
    
    -- 설계팀 사용 정보  
    design_project_code VARCHAR(50),                    -- 설계팀이 실제 사용한 코드
    design_project_name VARCHAR(200),                   -- 설계팀이 사용한 프로젝트명
    
    -- 매칭 정보
    is_code_matched BOOLEAN DEFAULT false,              -- 정식 코드 매칭 완료 여부
    matched_by VARCHAR(100),                            -- 매칭 작업자
    matched_at TIMESTAMP,                               -- 매칭 완료 시점
    
    -- 기본 정보
    status VARCHAR(20) DEFAULT 'active',                -- active/completed/on_hold
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    description TEXT,
    notes TEXT
);

-- ================================
-- 2. 파일 관리
-- ================================

-- 업로드된 자재 목록 파일들
CREATE TABLE files (
    id SERIAL PRIMARY KEY,
    project_id INTEGER REFERENCES projects(id) ON DELETE CASCADE,
    filename VARCHAR(255) NOT NULL,
    original_filename VARCHAR(255) NOT NULL,
    file_path VARCHAR(500) NOT NULL,
    revision VARCHAR(20) DEFAULT 'Rev.0',               -- Rev.0, Rev.1, Rev.2
    upload_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    uploaded_by VARCHAR(100),
    file_type VARCHAR(10),                              -- excel/csv/txt
    file_size INTEGER,
    is_active BOOLEAN DEFAULT true
);

-- ================================
-- 3. 자재 정보 (핵심 테이블)
-- ================================

-- 개별 자재 상세 정보
CREATE TABLE materials (
    id SERIAL PRIMARY KEY,
    file_id INTEGER REFERENCES files(id) ON DELETE CASCADE,
    line_number INTEGER,                                -- Excel 행 번호
    original_description TEXT NOT NULL,                 -- 원본 품명
    
    -- 분류 정보
    classified_category VARCHAR(50),                    -- 파이프/피팅/볼트/밸브/계기
    classified_subcategory VARCHAR(100),               -- 엘보우/플랜지/벤드 등
    
    -- 재질 및 스펙
    material_grade VARCHAR(50),                         -- A333-6, A105, SS316
    schedule VARCHAR(20),                               -- SCH40, SCH80, STD
    size_spec VARCHAR(50),                              -- 6인치, 150A, M16
    
    -- 수량 정보
    quantity DECIMAL(10,3) NOT NULL,
    unit VARCHAR(10) NOT NULL,                          -- EA/mm/SET/kg
    
    -- 도면 정보
    drawing_name VARCHAR(100),                          -- P&ID-001-TANK
    area_code VARCHAR(20),                              -- #01, #02, #03
    line_no VARCHAR(50),                                -- LINE-001-A
    
    -- 분류 신뢰도 및 검증
    classification_confidence DECIMAL(3,2),             -- 0.00-1.00 분류 신뢰도
    classification_details JSONB,                       -- 분류 상세 정보 (JSON)
    is_verified BOOLEAN DEFAULT false,                  -- 사용자 검증 여부
    verified_by VARCHAR(100),
    verified_at TIMESTAMP,
    
    -- 기타
    drawing_reference VARCHAR(100),
    notes TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- ================================
-- 4. 인덱스 생성 (성능 최적화)
-- ================================

-- 프로젝트 관련 인덱스
CREATE INDEX idx_projects_official_code ON projects(official_project_code);
CREATE INDEX idx_projects_design_code ON projects(design_project_code);

-- 파일 관련 인덱스
CREATE INDEX idx_files_project ON files(project_id);
CREATE INDEX idx_files_active ON files(is_active);

-- 자재 관련 인덱스
CREATE INDEX idx_materials_file ON materials(file_id);
CREATE INDEX idx_materials_category ON materials(classified_category, classified_subcategory);
CREATE INDEX idx_materials_material_size ON materials(material_grade, size_spec);

-- ================================
-- 5. 기본 뷰 생성
-- ================================

-- 프로젝트 상태 요약 뷰
CREATE VIEW project_status_view AS
SELECT 
    p.id,
    COALESCE(p.official_project_code, p.design_project_code) as display_code,
    p.project_name,
    p.status,
    COUNT(f.id) as file_count,
    COUNT(m.id) as material_count,
    p.created_at
FROM projects p
LEFT JOIN files f ON p.id = f.project_id AND f.is_active = true
LEFT JOIN materials m ON f.id = m.file_id
GROUP BY p.id, p.official_project_code, p.design_project_code, 
         p.project_name, p.status, p.created_at
ORDER BY p.created_at DESC;
