/**
 * Email Template Models
 *
 * EmailTemplateCategory — categories for organising email templates
 * EmailTemplate — email template records with AI generation support
 */

import mongoose, { Schema, Document } from 'mongoose';

// ============================================
// EMAIL TEMPLATE CATEGORY
// ============================================

export interface IEmailTemplateCategory extends Document {
  companyId: string;
  name: string;
  slug?: string;
  description?: string;
  icon?: string;
  colour?: string;
  order: number;
  templateCount: number;
  createdAt: Date;
  updatedAt: Date;
}

const EmailTemplateCategorySchema = new Schema<IEmailTemplateCategory>(
  {
    companyId: { type: String, required: [true, 'Company ID is required'] },
    name: { type: String, required: [true, 'Category name is required'], trim: true, maxlength: [100, 'Category name cannot exceed 100 characters'] },
    slug: { type: String, trim: true, lowercase: true },
    description: { type: String, trim: true },
    icon: { type: String, trim: true },
    colour: { type: String, trim: true },
    order: { type: Number, default: 0 },
    templateCount: { type: Number, default: 0 },
  },
  { timestamps: true }
);

EmailTemplateCategorySchema.index({ companyId: 1, slug: 1 }, { unique: false });

// ============================================
// EMAIL TEMPLATE
// ============================================

export type EmailTemplateType = 'marketing' | 'newsletter' | 'welcome' | 'promotion' | 'product-launch' | 'event-invitation' | 'announcement' | 'transactional' | 'custom';
export type EmailCategory = 'marketing' | 'newsletter' | 'welcome' | 'promotion' | 'product-launch' | 'event' | 'announcement' | 'custom';
export type EmailTemplateStatus = 'draft' | 'published' | 'archived';
export type EmailTemplateTone = 'professional' | 'friendly' | 'casual' | 'formal' | 'persuasive';

export interface IEmailTemplate extends Document {
  companyId: string;
  name: string;
  slug?: string;
  type: EmailTemplateType;
  category: EmailCategory;
  subjectLine: string;
  previewText?: string;
  body: string;
  ctaText?: string;
  ctaUrl?: string;
  tone: EmailTemplateTone;
  status: EmailTemplateStatus;
  tags?: string[];
  createdAt: Date;
  updatedAt: Date;
}

const EmailTemplateSchema = new Schema<IEmailTemplate>(
  {
    companyId: { type: String, required: [true, 'Company ID is required'] },
    name: { type: String, required: [true, 'Template name is required'], trim: true, maxlength: [200, 'Name cannot exceed 200 characters'] },
    slug: { type: String, trim: true, lowercase: true },
    type: { type: String, enum: ['marketing', 'newsletter', 'welcome', 'promotion', 'product-launch', 'event-invitation', 'announcement', 'transactional', 'custom'], default: 'marketing' },
    category: { type: String, enum: ['marketing', 'newsletter', 'welcome', 'promotion', 'product-launch', 'event', 'announcement', 'custom'], default: 'marketing' },
    subjectLine: { type: String, required: [true, 'Subject line is required'], trim: true, maxlength: [200, 'Subject line cannot exceed 200 characters'] },
    previewText: { type: String, trim: true, maxlength: [200, 'Preview text cannot exceed 200 characters'] },
    body: { type: String, required: [true, 'Email body is required'] },
    ctaText: { type: String, trim: true, maxlength: [50, 'CTA text cannot exceed 50 characters'] },
    ctaUrl: { type: String, trim: true },
    tone: { type: String, enum: ['professional', 'friendly', 'casual', 'formal', 'persuasive'], default: 'professional' },
    status: { type: String, enum: ['draft', 'published', 'archived'], default: 'draft' },
    tags: [{ type: String, trim: true }],
  },
  { timestamps: true }
);

EmailTemplateSchema.index({ companyId: 1, status: 1 });
EmailTemplateSchema.index({ companyId: 1, category: 1 });
EmailTemplateSchema.index({ companyId: 1, type: 1 });
EmailTemplateSchema.index({ companyId: 1, slug: 1 }, { unique: false });

// Auto-generate slug from name if not provided.
// Handles Unicode names (Hindi, Marathi, CJK, etc.) by producing a readable
// slug when Latin characters are present and a stable fallback otherwise.
EmailTemplateSchema.pre('save', function (next) {
  if (!this.slug && this.name) {
    let base = this.name
      .toLowerCase()
      .replace(/[^a-z0-9]+/g, '-')
      .replace(/^-|-$/g, '')
      .substring(0, 80);
    // If the name contains no Latin characters at all (e.g. Hindi/Marathi),
    // the regex above strips everything, leaving an empty base.
    // Produce a readable slug from the original name's first words.
    if (!base) {
      base = this.name
        .trim()
        .split(/\s+/)
        .slice(0, 3)
        .join('-')
        .substring(0, 40);
    }
    const suffix = Date.now().toString(36).slice(-4);
    this.slug = `${base}-${suffix}`;
  }
  next();
});

export const EmailTemplateCategory = mongoose.models.EmailTemplateCategory || mongoose.model('EmailTemplateCategory', EmailTemplateCategorySchema);
export const EmailTemplate = mongoose.models.EmailTemplate || mongoose.model('EmailTemplate', EmailTemplateSchema);