/**
 * AI Generated Version Model
 *
 * Tracks version history for AI-generated content across all Foundation modules.
 * Each successful AI generation creates a new version record while the frontend
 * always displays only the latest version.
 *
 * Supports: Business Profile, Founders, Employees, Products, ICPs, Personas, Competitors
 */

import mongoose, { Schema, Document } from 'mongoose';

// Allowed modules that support AI generation
export type AiGeneratedModule = 'business-profile' | 'founder' | 'employee' | 'product' | 'icp' | 'persona' | 'competitor';

// Allowed sources for AI generation
export type AiGeneratedSource = 'ai-generate-field' | 'ai-generate-popup' | 'business-profile-header' | 'quick-generate' | 'auto-fill' | 'regenerate' | 'regenerate-previous' | 'upload' | 'bulk-generate';

export interface IAiGeneratedVersion extends Document {
  companyId: string;
  entityId: string;
  module: AiGeneratedModule;
  field: string;
  version: number;
  content: string;
  generatedBy: string;
  source: AiGeneratedSource;
  promptContext?: Record<string, string>;
  createdAt: Date;
  updatedAt: Date;
}

const AiGeneratedVersionSchema = new Schema<IAiGeneratedVersion>(
  {
    companyId: {
      type: String,
      required: [true, 'Company ID is required'],
      index: true,
    },
    entityId: {
      type: String,
      required: [true, 'Entity ID is required'],
      index: true,
    },
    module: {
      type: String,
      required: [true, 'Module is required'],
      enum: {
        values: ['business-profile', 'founder', 'employee', 'product', 'icp', 'persona', 'competitor'],
        message: '{VALUE} is not a valid module',
      },
    },
    field: {
      type: String,
      required: [true, 'Field name is required'],
    },
    version: {
      type: Number,
      required: [true, 'Version number is required'],
      min: [1, 'Version must be at least 1'],
    },
    content: {
      type: String,
      required: [true, 'Content is required'],
    },
    generatedBy: {
      type: String,
      required: [true, 'Generated by user ID is required'],
    },
    source: {
      type: String,
      default: 'ai-generate-field',
      enum: {
        values: ['ai-generate-field', 'ai-generate-popup', 'business-profile-header', 'quick-generate', 'auto-fill', 'regenerate', 'regenerate-previous', 'upload', 'bulk-generate'],
        message: '{VALUE} is not a valid source',
      },
    },
    promptContext: {
      type: Schema.Types.Mixed,
      default: undefined,
    },
  },
  { timestamps: true }
);

// Compound unique index: prevent duplicate versions for the same entity+module+field
AiGeneratedVersionSchema.index(
  { entityId: 1, module: 1, field: 1, version: 1 },
  { unique: true }
);

// Compound index for "get latest version" queries (sorted by version desc)
AiGeneratedVersionSchema.index(
  { entityId: 1, module: 1, field: 1, version: -1 }
);

// Company-level index for admin queries
AiGeneratedVersionSchema.index({ companyId: 1 });

const AiGeneratedVersion = mongoose.models.AiGeneratedVersion ||
  mongoose.model<IAiGeneratedVersion>('AiGeneratedVersion', AiGeneratedVersionSchema);

export { AiGeneratedVersion };