-- =============================================================================
-- Migration 032: Add notification_templates table
-- Description: Tạo bảng lưu trữ mẫu thông báo (template) với nội dung động
-- Author: System
-- Date: 2026-06-02
-- Depends on: 003-notification-schema.sql
-- =============================================================================

-- =============================================================================
-- ENUM TYPES
-- =============================================================================

-- Template type (loại mẫu thông báo)
DO $$ BEGIN
    CREATE TYPE notification_template_type AS ENUM (
        'MARKETING',      -- Khuyến mãi, quảng cáo
        'BILLING',        -- Hóa đơn, thanh toán
        'SYSTEM_ALERT',   -- Cảnh báo hệ thống
        'TRANSACTIONAL',  -- Giao dịch
        'REMINDER',       -- Nhắc nhở
        'ANNOUNCEMENT'    -- Thông báo chung
    );
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- Template status (trạng thái mẫu)
DO $$ BEGIN
    CREATE TYPE notification_template_status AS ENUM (
        'ACTIVE',    -- Đang hoạt động
        'INACTIVE',  -- Tạm dừng
        'DRAFT'      -- Bản nháp
    );
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- Template channel (kênh áp dụng)
-- Note: Sử dụng lại notification_channel từ 003-notification-schema.sql nếu có
-- Hoặc định nghĩa riêng cho templates
DO $$ BEGIN
    CREATE TYPE notification_template_channel AS ENUM (
        'SMS',        -- Tin nhắn SMS
        'EMAIL',      -- Email
        'ZALO_ZNS',   -- Zalo ZNS (Zalo Notification Service)
        'ZALO_OA',    -- Zalo Official Account
        'APP_PUSH',   -- Push notification trong app
        'IN_APP',     -- Thông báo trong app
        'WEB_PUSH'    -- Web push notification
    );
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- =============================================================================
-- TABLE: notification_templates
-- =============================================================================

CREATE TABLE IF NOT EXISTS notification_templates (
    -- Primary Key
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    
    -- Template Identification
    code              VARCHAR(50) NOT NULL UNIQUE,
    name              VARCHAR(255) NOT NULL,
    
    -- Template Classification
    type              notification_template_type NOT NULL,
    channel           notification_template_channel NOT NULL,
    
    -- Template Content (với biến động)
    -- VD: "Chào {{tenant_name}}, hóa đơn tháng {{month}} cho phòng {{room_name}} là {{amount}} VNĐ"
    content           TEXT NOT NULL,
    
    -- Optional: Subject cho email/SMS
    subject           VARCHAR(500),
    
    -- Metadata
    description       TEXT,
    
    -- Variables definition (JSON array)
    -- VD: ["tenant_name", "room_name", "amount", "month", "due_date"]
    variables         JSONB,
    
    -- Template Status
    status            notification_template_status NOT NULL DEFAULT 'ACTIVE',
    
    -- Audit fields
    created_by        UUID REFERENCES users(id) ON DELETE SET NULL,
    updated_by        UUID REFERENCES users(id) ON DELETE SET NULL,
    created_at        TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at        TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);

-- =============================================================================
-- INDEXES
-- =============================================================================

-- Index cho tìm kiếm theo code (unique đã tạo index tự động)
-- CREATE INDEX idx_notification_templates_code ON notification_templates(code);

-- Index cho filter theo type và status
CREATE INDEX idx_notification_templates_type_status 
    ON notification_templates(type, status);

-- Index cho filter theo channel
CREATE INDEX idx_notification_templates_channel 
    ON notification_templates(channel) 
    WHERE status = 'ACTIVE';

-- Index cho filter theo status
CREATE INDEX idx_notification_templates_status 
    ON notification_templates(status);

-- Index cho audit
CREATE INDEX idx_notification_templates_created_at 
    ON notification_templates(created_at DESC);

-- =============================================================================
-- SEED DATA (Optional - Comment out nếu không cần)
-- =============================================================================

-- Sample templates cho billing
INSERT INTO notification_templates (code, name, type, channel, content, subject, variables, description, status) VALUES
-- 1. Chào mừng cư dân mới
(
    'WELCOME_NEW_RESIDENT',
    'Chào mừng cư dân mới',
    'ANNOUNCEMENT',
    'APP_PUSH',
    'Chào mừng {tenant_name} đến với {building}! Chúng tôi rất vui được chào đón bạn. Nếu cần hỗ trợ, vui lòng liên hệ ban quản lý.',
    'Chào mừng đến với {building}',
    '["tenant_name", "building"]'::jsonb,
    'Thông báo chào mừng cư dân mới',
    'ACTIVE'
),
-- 2. Nhắc hóa đơn quá hạn
(
    'BILL_OVERDUE',
    'Nhắc quá hạn',
    'BILLING',
    'APP_PUSH',
    'Hóa đơn tháng {month} của bạn đã quá hạn {days_overdue} ngày. Số tiền: {amount}. Vui lòng thanh toán ngay để tránh bị ngắt dịch vụ.',
    'Hóa đơn tháng {month} đã quá hạn',
    '["month", "days_overdue", "amount"]'::jsonb,
    'Nhắc nhở hóa đơn quá hạn thanh toán',
    'ACTIVE'
),
-- 3. Hóa đơn tháng (template gốc)
(
    'BILL_MONTHLY',
    'Hóa đơn tháng',
    'BILLING',
    'ZALO_ZNS',
    'Chào {tenant_name}, hóa đơn tháng {month} cho phòng {room_name} là {amount} VNĐ. Hạn thanh toán: {due_date}.',
    NULL,
    '["tenant_name", "month", "room_name", "amount", "due_date"]'::jsonb,
    'Template gửi hóa đơn tháng qua Zalo ZNS',
    'ACTIVE'
),
-- 4. Thanh toán thành công
(
    'PAYMENT_SUCCESS',
    'Thanh toán thành công',
    'TRANSACTIONAL',
    'APP_PUSH',
    'Thanh toán {amount} VNĐ cho hóa đơn {bill_id} đã thành công. Cảm ơn bạn!',
    'Thanh toán thành công',
    '["amount", "bill_id"]'::jsonb,
    'Thông báo thanh toán thành công qua app push',
    'ACTIVE'
),
-- 5. Thanh toán thất bại
(
    'PAYMENT_FAILED',
    'Thanh toán thất bại',
    'TRANSACTIONAL',
    'APP_PUSH',
    'Thanh toán {amount} VNĐ thất bại. Lý do: {reason}. Vui lòng thử lại.',
    'Thanh toán thất bại',
    '["amount", "reason"]'::jsonb,
    'Thông báo thanh toán thất bại',
    'ACTIVE'
),
-- 6. Hợp đồng sắp hết hạn
(
    'CONTRACT_EXPIRY',
    'Hợp đồng sắp hết hạn',
    'REMINDER',
    'SMS',
    'Thông báo: Hợp đồng thuê phòng {room_name} sẽ hết hạn vào {expiry_date}. Liên hệ {phone} để gia hạn.',
    NULL,
    '["room_name", "expiry_date", "phone"]'::jsonb,
    'Nhắc hợp đồng sắp hết hạn qua SMS',
    'ACTIVE'
),
-- 7. Bảo trì định kỳ
(
    'MAINTENANCE_SCHEDULED',
    'Bảo trì định kỳ',
    'SYSTEM_ALERT',
    'EMAIL',
    'Kính gửi {tenant_name},\n\nHệ thống sẽ bảo trì vào {maintenance_date} từ {start_time} đến {end_time}.\n\nTrân trọng,\nBan quản lý',
    'Thông báo bảo trì hệ thống',
    '["tenant_name", "maintenance_date", "start_time", "end_time"]'::jsonb,
    'Thông báo bảo trì định kỳ qua email',
    'ACTIVE'
),
-- 8. Flash Sale
(
    'PROMOTION_FLASH_SALE',
    'Flash Sale',
    'MARKETING',
    'ZALO_OA',
    '🔥 FLASH SALE 🔥\n\nGiảm {discount}% cho dịch vụ {service_name}!\nChỉ trong {duration}.\n\nĐặt ngay: {link}',
    NULL,
    '["discount", "service_name", "duration", "link"]'::jsonb,
    'Template flash sale marketing qua Zalo OA',
    'ACTIVE'
);

-- =============================================================================
-- ROLLBACK SCRIPT (Comment - for reference only)
-- =============================================================================

/*
-- Drop table
DROP TABLE IF EXISTS notification_templates CASCADE;

-- Drop types
DROP TYPE IF EXISTS notification_template_status CASCADE;
DROP TYPE IF EXISTS notification_template_type CASCADE;
DROP TYPE IF EXISTS notification_template_channel CASCADE;
*/

-- =============================================================================
-- END OF MIGRATION
-- =============================================================================
