-- ================================
-- Tubing 제품 관리 시스템
-- 실행일: 2025.08.01
-- ================================

-- 1. Tubing 카테고리 테이블 (일반, VCR, 기타 등)
CREATE TABLE IF NOT EXISTS tubing_categories (
    id SERIAL PRIMARY KEY,
    category_code VARCHAR(20) UNIQUE NOT NULL,
    category_name VARCHAR(100) NOT NULL,
    description TEXT,
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 2. Tubing 규격 마스터 테이블
CREATE TABLE IF NOT EXISTS tubing_specifications (
    id SERIAL PRIMARY KEY,
    category_id INTEGER REFERENCES tubing_categories(id),
    spec_code VARCHAR(50) UNIQUE NOT NULL,
    spec_name VARCHAR(200) NOT NULL,
    
    -- 물리적 규격
    outer_diameter_mm DECIMAL(8,3),           -- 외경 (mm)
    wall_thickness_mm DECIMAL(6,3),          -- 두께 (mm)
    inner_diameter_mm DECIMAL(8,3),          -- 내경 (mm, 계산 또는 실측)
    
    -- 재질 정보
    material_grade VARCHAR(100),             -- SS316, SS316L, Inconel625 등
    material_standard VARCHAR(100),          -- ASTM A269, JIS G3463 등
    
    -- 압력/온도 등급
    max_pressure_bar DECIMAL(8,2),          -- 최대 압력 (bar)
    max_temperature_c DECIMAL(6,2),         -- 최대 온도 (°C)
    min_temperature_c DECIMAL(6,2),         -- 최소 온도 (°C)
    
    -- 표준 규격
    standard_length_m DECIMAL(8,3),         -- 표준 길이 (m)
    bend_radius_min_mm DECIMAL(8,2),        -- 최소 벤딩 반경 (mm)
    
    -- 기타 정보
    surface_finish VARCHAR(100),            -- 표면 마감 (BA, #4, 2B 등)
    hardness VARCHAR(50),                   -- 경도
    notes TEXT,
    
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 3. 제조사 정보 테이블
CREATE TABLE IF NOT EXISTS tubing_manufacturers (
    id SERIAL PRIMARY KEY,
    manufacturer_code VARCHAR(20) UNIQUE NOT NULL,
    manufacturer_name VARCHAR(200) NOT NULL,
    country VARCHAR(100),
    website VARCHAR(500),
    contact_info JSONB,                     -- 연락처 정보 (JSON)
    quality_certs JSONB,                    -- 품질 인증서 정보 (ISO, API 등)
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 4. 제조사별 제품 테이블 (품목번호 매핑)
CREATE TABLE IF NOT EXISTS tubing_products (
    id SERIAL PRIMARY KEY,
    specification_id INTEGER REFERENCES tubing_specifications(id),
    manufacturer_id INTEGER REFERENCES tubing_manufacturers(id),
    
    -- 제조사 품목번호 정보
    manufacturer_part_number VARCHAR(200) NOT NULL,  -- 제조사 품목번호
    manufacturer_product_name VARCHAR(300),          -- 제조사 제품명
    
    -- 가격/공급 정보
    list_price DECIMAL(12,2),                       -- 정가
    currency VARCHAR(10) DEFAULT 'KRW',             -- 통화
    lead_time_days INTEGER,                         -- 리드타임 (일)
    minimum_order_qty DECIMAL(10,3),                -- 최소 주문 수량
    standard_packaging_qty DECIMAL(10,3),           -- 표준 포장 수량
    
    -- 가용성 정보
    availability_status VARCHAR(50),                -- 재고 상태
    last_price_update DATE,                         -- 마지막 가격 업데이트
    
    -- 추가 정보
    datasheet_url VARCHAR(500),                     -- 데이터시트 URL
    catalog_page VARCHAR(100),                      -- 카탈로그 페이지
    notes TEXT,
    
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    -- 유니크 제약 (같은 규격의 같은 제조사 제품은 하나만)
    UNIQUE(specification_id, manufacturer_id, manufacturer_part_number)
);

-- 5. BOM에서 사용되는 Tubing 매핑 테이블
CREATE TABLE IF NOT EXISTS material_tubing_mapping (
    id SERIAL PRIMARY KEY,
    material_id INTEGER REFERENCES materials(id) ON DELETE CASCADE,
    tubing_product_id INTEGER REFERENCES tubing_products(id),
    
    -- 매핑 정보
    confidence_score DECIMAL(3,2),                  -- 매핑 신뢰도 (0.00-1.00)
    mapping_method VARCHAR(50),                     -- 매핑 방법 (auto/manual)
    mapped_by VARCHAR(100),                         -- 매핑한 사용자
    mapped_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    -- 수량 정보
    required_length_m DECIMAL(10,3),                -- 필요 길이 (m)
    calculated_quantity DECIMAL(10,3),              -- 계산된 주문 수량
    
    -- 검증 정보
    is_verified BOOLEAN DEFAULT FALSE,
    verified_by VARCHAR(100),
    verified_at TIMESTAMP,
    
    notes TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- ================================
-- 인덱스 생성
-- ================================

-- Tubing 규격 관련 인덱스
CREATE INDEX idx_tubing_specs_category ON tubing_specifications(category_id);
CREATE INDEX idx_tubing_specs_material ON tubing_specifications(material_grade);
CREATE INDEX idx_tubing_specs_diameter ON tubing_specifications(outer_diameter_mm, wall_thickness_mm);

-- 제품 관련 인덱스
CREATE INDEX idx_tubing_products_spec ON tubing_products(specification_id);
CREATE INDEX idx_tubing_products_manufacturer ON tubing_products(manufacturer_id);
CREATE INDEX idx_tubing_products_part_number ON tubing_products(manufacturer_part_number);

-- 매핑 관련 인덱스
CREATE INDEX idx_material_tubing_mapping_material ON material_tubing_mapping(material_id);
CREATE INDEX idx_material_tubing_mapping_product ON material_tubing_mapping(tubing_product_id);

-- ================================
-- 기초 데이터 입력
-- ================================

-- Tubing 카테고리 기초 데이터
INSERT INTO tubing_categories (category_code, category_name, description) VALUES
('GENERAL', '일반 Tubing', '일반적인 스테인리스 스틸 튜빙'),
('VCR', 'VCR Tubing', 'VCR (Vacuum Coupling Radiation) 연결용 튜빙'),
('SANITARY', 'Sanitary Tubing', '위생용 튜빙 (식품, 제약 등)'),
('HVAC', 'HVAC Tubing', '공조용 튜빙'),
('HYDRAULIC', 'Hydraulic Tubing', '유압용 튜빙'),
('PNEUMATIC', 'Pneumatic Tubing', '공압용 튜빙'),
('PROCESS', 'Process Tubing', '공정용 특수 튜빙'),
('EXOTIC', 'Exotic Material', '특수 재질 튜빙 (Hastelloy, Inconel 등)')
ON CONFLICT (category_code) DO NOTHING;

-- 주요 제조사 기초 데이터
INSERT INTO tubing_manufacturers (manufacturer_code, manufacturer_name, country) VALUES
('SWAGELOK', 'Swagelok Company', 'USA'),
('PARKER', 'Parker Hannifin', 'USA'),
('HAM_LET', 'Ham-Let Group', 'Israel'),
('SUPERLOK', 'Superlok USA', 'USA'),
('FITOK', 'Fitok Group', 'China'),
('DK_LOK', 'DK-Lok Corporation', 'South Korea'),
('GYROLOK', 'Gyrolok (Oliver Valves)', 'UK'),
('AS_ONE', 'AS ONE Corporation', 'Japan')
ON CONFLICT (manufacturer_code) DO NOTHING;

-- 기본 스테인리스 스틸 튜빙 규격 예시
INSERT INTO tubing_specifications (
    category_id, spec_code, spec_name, 
    outer_diameter_mm, wall_thickness_mm, inner_diameter_mm,
    material_grade, material_standard,
    max_pressure_bar, max_temperature_c, min_temperature_c,
    standard_length_m
) VALUES
(1, 'SS316-6MM-1MM', '6mm OD x 1mm WT SS316 Tubing', 6.0, 1.0, 4.0, 'SS316', 'ASTM A269', 413, 815, -196, 6.0),
(1, 'SS316-8MM-1MM', '8mm OD x 1mm WT SS316 Tubing', 8.0, 1.0, 6.0, 'SS316', 'ASTM A269', 310, 815, -196, 6.0),
(1, 'SS316-10MM-1MM', '10mm OD x 1mm WT SS316 Tubing', 10.0, 1.0, 8.0, 'SS316', 'ASTM A269', 248, 815, -196, 6.0),
(1, 'SS316-12MM-1.5MM', '12mm OD x 1.5mm WT SS316 Tubing', 12.0, 1.5, 9.0, 'SS316', 'ASTM A269', 310, 815, -196, 6.0),
(1, 'SS316L-6MM-1MM', '6mm OD x 1mm WT SS316L Tubing', 6.0, 1.0, 4.0, 'SS316L', 'ASTM A269', 413, 815, -196, 6.0)
ON CONFLICT (spec_code) DO NOTHING;