-- V48 시스템관리 '메시지 관리' — 메시지 템플릿 리소스 + 샘플 전량 시드 (#35)
-- 목표: 알림/이메일/통지 문구를 코드·로케일별 템플릿({name}·{eventName} 등 중괄호 플레이스홀더)으로 중앙 관리.
--   렌더 API가 template 의 {key} 를 파라미터로 치환해 최종 문자열을 만든다(코드 계층).
-- 불변: V1~V47 파일 불변. 본 마이그레이션은 순증(additive)·멱등(ON CONFLICT)만 수행한다.
-- 테넌트 표준(V31): tenant_id DEFAULT 'KINTEX', 복합 PK 선두 (tenant_id, msg_code, locale).
-- 보안 불변(§0-3): 템플릿은 문구만 저장 — 비밀번호·시크릿·PII 실값 미저장(치환 파라미터는 런타임 전달).

-- ============================================================================
-- 1) 테이블 — 메시지 템플릿
-- ============================================================================
CREATE TABLE IF NOT EXISTS sys_message (
    tenant_id  varchar(40)  NOT NULL DEFAULT 'KINTEX',
    msg_code   varchar(60)  NOT NULL,                 -- 메시지 코드(예: AUCTION_INVITE)
    locale     varchar(10)  NOT NULL DEFAULT 'ko',    -- ko/en/zh/ja
    category   varchar(40)  NOT NULL,                 -- 분류(AUCTION/SETTLEMENT/ACCOUNT/VISITOR/MARKETING)
    title      varchar(300) NOT NULL,                 -- 제목/요약(플레이스홀더 포함 가능)
    template   text         NOT NULL,                 -- 본문 템플릿({key} 플레이스홀더 포함)
    use_yn     char(1)      NOT NULL DEFAULT 'Y',
    updated_at timestamptz  NOT NULL DEFAULT now(),
    PRIMARY KEY (tenant_id, msg_code, locale)
);
CREATE INDEX IF NOT EXISTS idx_sys_message_cat ON sys_message (tenant_id, category, msg_code);

-- ============================================================================
-- 2) 샘플 전량 시드 — 주요 메시지 리소스 전 카테고리 × (ko/en/zh/ja)
--    ON CONFLICT DO UPDATE 로 멱등. 플레이스홀더는 중괄호 {key}.
-- ============================================================================
INSERT INTO sys_message (tenant_id, msg_code, locale, category, title, template) VALUES
-- AUCTION: 옥션(입찰) 통지
('KINTEX','AUCTION_INVITE','ko','AUCTION','[{eventName}] 장치공사 입찰 안내',
 '{companyName} 담당자님, {eventName} 부스({boothNo}) 장치공사 입찰에 초대합니다. 마감일: {dueDate}. 킨텍스 AI 전시시스템에서 견적을 제출해 주세요.'),
('KINTEX','AUCTION_INVITE','en','AUCTION','[{eventName}] Booth Construction Bid Invitation',
 'Dear {companyName}, you are invited to bid for booth ({boothNo}) construction of {eventName}. Deadline: {dueDate}. Please submit your quotation on the KINTEX AI system.'),
('KINTEX','AUCTION_INVITE','zh','AUCTION','[{eventName}] 展位施工招标邀请',
 '{companyName} 负责人您好，诚邀您参与 {eventName} 展位（{boothNo}）施工招标。截止日期：{dueDate}。请在 KINTEX AI 系统提交报价。'),
('KINTEX','AUCTION_INVITE','ja','AUCTION','[{eventName}] ブース施工入札のご案内',
 '{companyName} ご担当者様、{eventName} ブース（{boothNo}）施工の入札にご招待します。締切: {dueDate}。KINTEX AI システムで見積をご提出ください。'),
-- AUCTION: 낙찰
('KINTEX','AUCTION_AWARD','ko','AUCTION','[{eventName}] 낙찰 안내',
 '{companyName} 담당자님, {eventName} 장치공사 입찰에 낙찰되셨습니다. 낙찰 금액: {amount}원. 세부 일정은 시스템에서 확인해 주세요.'),
('KINTEX','AUCTION_AWARD','en','AUCTION','[{eventName}] Award Notice',
 'Dear {companyName}, you have won the construction bid for {eventName}. Award amount: {amount} KRW. Please check the schedule on the system.'),
('KINTEX','AUCTION_AWARD','zh','AUCTION','[{eventName}] 中标通知',
 '{companyName} 负责人您好，恭喜您中标 {eventName} 施工项目。中标金额：{amount} 韩元。请在系统查看详细日程。'),
('KINTEX','AUCTION_AWARD','ja','AUCTION','[{eventName}] 落札のご案内',
 '{companyName} ご担当者様、{eventName} 施工入札に落札されました。落札金額: {amount}ウォン。詳細日程はシステムでご確認ください。'),
-- SETTLEMENT: 정산 청구
('KINTEX','SETTLE_INVOICE','ko','SETTLEMENT','[정산] 청구서 발행 안내',
 '{companyName} 담당자님, 청구서({invoiceNo})가 발행되었습니다. 청구 금액: {amount}원, 납부 기한: {dueDate}. 감사합니다.'),
('KINTEX','SETTLE_INVOICE','en','SETTLEMENT','[Settlement] Invoice Issued',
 'Dear {companyName}, invoice ({invoiceNo}) has been issued. Amount: {amount} KRW, due by {dueDate}. Thank you.'),
('KINTEX','SETTLE_INVOICE','zh','SETTLEMENT','[结算] 账单已开具',
 '{companyName} 负责人您好，账单（{invoiceNo}）已开具。金额：{amount} 韩元，付款期限：{dueDate}。谢谢。'),
('KINTEX','SETTLE_INVOICE','ja','SETTLEMENT','[精算] 請求書発行のご案内',
 '{companyName} ご担当者様、請求書（{invoiceNo}）が発行されました。金額: {amount}ウォン、支払期限: {dueDate}。ありがとうございます。'),
-- SETTLEMENT: 마감임박
('KINTEX','SETTLE_DUE','ko','SETTLEMENT','[정산] 납부 마감 임박 안내',
 '{companyName} 담당자님, 청구서({invoiceNo})의 납부 기한이 {dueDate}로 임박했습니다. 기한 내 납부 부탁드립니다.'),
('KINTEX','SETTLE_DUE','en','SETTLEMENT','[Settlement] Payment Due Soon',
 'Dear {companyName}, payment for invoice ({invoiceNo}) is due on {dueDate}. Please complete payment on time.'),
('KINTEX','SETTLE_DUE','zh','SETTLEMENT','[结算] 付款截止临近',
 '{companyName} 负责人您好，账单（{invoiceNo}）付款期限 {dueDate} 临近，请按时付款。'),
('KINTEX','SETTLE_DUE','ja','SETTLEMENT','[精算] 支払期限が近づいています',
 '{companyName} ご担当者様、請求書（{invoiceNo}）の支払期限 {dueDate} が近づいています。期限内のお支払をお願いします。'),
-- ACCOUNT: 환영
('KINTEX','WELCOME','ko','ACCOUNT','환영합니다, {name}님',
 '{name}님, KINTEX AI 전시·행사시스템에 오신 것을 환영합니다. {eventName} 준비를 함께 시작해 보세요.'),
('KINTEX','WELCOME','en','ACCOUNT','Welcome, {name}',
 'Hi {name}, welcome to the KINTEX AI Exhibition System. Let us start preparing {eventName} together.'),
('KINTEX','WELCOME','zh','ACCOUNT','欢迎您，{name}',
 '{name} 您好，欢迎使用 KINTEX AI 展览系统。让我们一起开始筹备 {eventName} 吧。'),
('KINTEX','WELCOME','ja','ACCOUNT','ようこそ、{name}様',
 '{name}様、KINTEX AI 展示会システムへようこそ。{eventName} の準備を一緒に始めましょう。'),
-- ACCOUNT: 비밀번호 재설정
('KINTEX','PASSWORD_RESET','ko','ACCOUNT','[보안] 비밀번호 재설정 안내',
 '{name}님, 비밀번호 재설정을 요청하셨습니다. 아래 링크는 {expireMin}분간 유효합니다: {resetLink}. 본인이 아니라면 무시하세요.'),
('KINTEX','PASSWORD_RESET','en','ACCOUNT','[Security] Reset Your Password',
 'Hi {name}, you requested a password reset. The link is valid for {expireMin} minutes: {resetLink}. Ignore if this was not you.'),
('KINTEX','PASSWORD_RESET','zh','ACCOUNT','[安全] 重置密码',
 '{name} 您好，您申请了重置密码。链接 {expireMin} 分钟内有效：{resetLink}。若非本人操作请忽略。'),
('KINTEX','PASSWORD_RESET','ja','ACCOUNT','[セキュリティ] パスワード再設定のご案内',
 '{name}様、パスワード再設定のリクエストを受け付けました。リンクは {expireMin} 分間有効です: {resetLink}。心当たりがない場合は無視してください。'),
-- VISITOR: 체크인
('KINTEX','CHECKIN','ko','VISITOR','[{eventName}] 체크인 완료',
 '{name}님, {eventName} 체크인이 완료되었습니다. 관심 부스({boothNo})를 둘러보세요. 즐거운 관람 되세요.'),
('KINTEX','CHECKIN','en','VISITOR','[{eventName}] Check-in Complete',
 'Hi {name}, your check-in for {eventName} is complete. Explore booth ({boothNo}). Enjoy the show.'),
('KINTEX','CHECKIN','zh','VISITOR','[{eventName}] 签到完成',
 '{name} 您好，您在 {eventName} 的签到已完成。请参观展位（{boothNo}）。祝您观展愉快。'),
('KINTEX','CHECKIN','ja','VISITOR','[{eventName}] チェックイン完了',
 '{name}様、{eventName} のチェックインが完了しました。ブース（{boothNo}）をご覧ください。ごゆっくりお楽しみください。'),
-- VISITOR: 배지 발급
('KINTEX','BADGE_ISSUE','ko','VISITOR','[{eventName}] 배지 발급 안내',
 '{name}님, 관람 배지({badgeNo})가 발급되었습니다. 입장 시 QR 코드를 제시해 주세요.'),
('KINTEX','BADGE_ISSUE','en','VISITOR','[{eventName}] Badge Issued',
 'Hi {name}, your badge ({badgeNo}) for {eventName} has been issued. Present the QR code at entry.'),
('KINTEX','BADGE_ISSUE','zh','VISITOR','[{eventName}] 参观证已发放',
 '{name} 您好，您在 {eventName} 的参观证（{badgeNo}）已发放。入场时请出示二维码。'),
('KINTEX','BADGE_ISSUE','ja','VISITOR','[{eventName}] バッジ発行のご案内',
 '{name}様、{eventName} の入場バッジ（{badgeNo}）が発行されました。入場時に QR コードをご提示ください。'),
-- MARKETING: EDM(홍보 메일)
('KINTEX','EDM','ko','MARKETING','[{eventName}] 사전등록 안내',
 '{name}님, {eventName}이(가) {eventDate}에 열립니다. 지금 사전등록하고 다양한 혜택을 받으세요.'),
('KINTEX','EDM','en','MARKETING','[{eventName}] Pre-registration Open',
 'Hi {name}, {eventName} opens on {eventDate}. Pre-register now to enjoy exclusive benefits.'),
('KINTEX','EDM','zh','MARKETING','[{eventName}] 预登记开放',
 '{name} 您好，{eventName} 将于 {eventDate} 举行。立即预登记，享受专属优惠。'),
('KINTEX','EDM','ja','MARKETING','[{eventName}] 事前登録のご案内',
 '{name}様、{eventName} が {eventDate} に開催されます。今すぐ事前登録して特典をお受け取りください。')
ON CONFLICT (tenant_id, msg_code, locale) DO UPDATE
   SET category = EXCLUDED.category,
       title    = EXCLUDED.title,
       template = EXCLUDED.template,
       use_yn   = 'Y',
       updated_at = now();
