/**
 * Image Generation Model
 *
 * Stores AI-generated images with version history, prompt enhancement data,
 * and integration with Brand Assets.
 */

import mongoose, { Schema, Document, Types } from 'mongoose';

// ============================================
// TYPES
// ============================================

export type ImageStyle =
  | 'Realistic'
  | 'Illustration'
  | '3D'
  | 'Cartoon'
  | 'Minimalist'
  | 'Abstract'
  | 'Photography'
  | 'Watercolor'
  | 'PixelArt'
  | 'Sketch'
  | 'Noir'
  | 'PopArt'
  | 'Vintage';

export type ImagePlatform =
  | 'Instagram'
  | 'Facebook'
  | 'LinkedIn'
  | 'Twitter/X'
  | 'Website'
  | 'Blog'
  | 'Email'
  | 'Presentation'
  | 'Print'
  | 'YouTube'
  | 'TikTok'
  | 'Pinterest'
  | 'Other';

export type ImageAspectRatio = '1:1' | '16:9' | '9:16' | '4:3' | '3:2' | '3:4' | '2:3';

export type ImageGenerationStatus = 'pending' | 'enhancing' | 'generating' | 'completed' | 'failed';

export type ImageQuality = 'standard' | 'hd';

export type DallEStyle = 'vivid' | 'natural';

export interface IImageGenerationVersion extends Document {
  version: number;
  prompt: string;
  enhancedPrompt?: string;
  imageUrl?: string;
  base64Data?: string;
  generationProvider: string;
  generationModel: string;
  aspectRatio: string;
  size: string;
  quality: ImageQuality;
  style: DallEStyle;
  revisedPrompt?: string;
  tokenUsage?: {
    inputTokens: number;
    outputTokens: number;
    totalTokens: number;
  };
  latencyMs?: number;
  isCurrent: boolean;
  createdAt: Date;
}

export interface IImageGeneration extends Document {
  companyId: string;
  name?: string;
  description: string;
  objective?: string;
  style: ImageStyle;
  targetAudience?: string;
  platform: ImagePlatform;
  aspectRatio: ImageAspectRatio;
  additionalInstructions?: string;
  originalPrompt: string;
  ollamaEnhancedPrompt?: string;
  ollamaModel?: string;
  generationProvider?: string;
  generationModel?: string;
  status: ImageGenerationStatus;
  brandAssetId?: string;
  hrAssetId?: string;
  stationeryAssetId?: string;
  tags: Types.Array<string>;
  versions: Types.DocumentArray<IImageGenerationVersion>;
  currentVersion: number;
  totalVersions: number;
  createdBy?: string;
  createdAt: Date;
  updatedAt: Date;
}

// ============================================
// SUBDOCUMENT SCHEMA — VERSION
// ============================================

const ImageGenerationVersionSchema = new Schema<IImageGenerationVersion>(
  {
    version: {
      type: Number,
      required: true,
    },
    prompt: {
      type: String,
      required: true,
    },
    enhancedPrompt: String,
    imageUrl: String,
    base64Data: String,
    generationProvider: {
      type: String,
      default: 'openai',
    },
    generationModel: {
      type: String,
      default: 'gpt-image-1',
    },
    aspectRatio: String,
    size: {
      type: String,
      default: '1024x1024',
    },
    quality: {
      type: String,
      enum: ['standard', 'hd'],
      default: 'standard',
    },
    style: {
      type: String,
      enum: ['vivid', 'natural'],
      default: 'vivid',
    },
    revisedPrompt: String,
    tokenUsage: {
      inputTokens: { type: Number, default: 0 },
      outputTokens: { type: Number, default: 0 },
      totalTokens: { type: Number, default: 0 },
    },
    latencyMs: Number,
    isCurrent: {
      type: Boolean,
      default: false,
    },
  },
  { _id: false, timestamps: false }
);

// ============================================
// MAIN SCHEMA
// ============================================

const ImageGenerationSchema = new Schema<IImageGeneration>(
  {
    companyId: {
      type: String,
      required: [true, 'Company ID is required'],
      index: true,
    },
    name: {
      type: String,
      trim: true,
      maxlength: [200, 'Name cannot exceed 200 characters'],
    },
    description: {
      type: String,
      required: [true, 'Description is required'],
      maxlength: [2000, 'Description cannot exceed 2000 characters'],
    },
    objective: {
      type: String,
      maxlength: [500, 'Objective cannot exceed 500 characters'],
    },
    style: {
      type: String,
      required: [true, 'Style is required'],
      enum: [
        'Realistic',
        'Illustration',
        '3D',
        'Cartoon',
        'Minimalist',
        'Abstract',
        'Photography',
        'Watercolor',
        'PixelArt',
        'Sketch',
        'Noir',
        'PopArt',
        'Vintage',
      ],
    },
    targetAudience: {
      type: String,
      maxlength: [500, 'Target audience cannot exceed 500 characters'],
    },
    platform: {
      type: String,
      required: [true, 'Platform is required'],
      // No enum restriction — accepts any platform string (e.g. 'instagram', 'Instagram')
      // This prevents validation crashes when new platforms are added on the frontend.
    },
    aspectRatio: {
      type: String,
      required: [true, 'Aspect ratio is required'],
      enum: ['1:1', '16:9', '9:16', '4:3', '3:2', '3:4', '2:3'],
    },
    additionalInstructions: {
      type: String,
      maxlength: [1000, 'Additional instructions cannot exceed 1000 characters'],
    },
    originalPrompt: {
      type: String,
      required: [true, 'Original prompt is required'],
      maxlength: [3000, 'Original prompt cannot exceed 3000 characters'],
    },
    ollamaEnhancedPrompt: {
      type: String,
      maxlength: [15000, 'Enhanced prompt cannot exceed 15000 characters'],
    },
    ollamaModel: String,
    generationProvider: {
      type: String,
      default: 'openai',
    },
    generationModel: {
      type: String,
      default: 'gpt-image-1',
    },
    status: {
      type: String,
      enum: ['pending', 'enhancing', 'generating', 'completed', 'failed'],
      default: 'pending',
    },
    brandAssetId: String,
    hrAssetId: String,
    stationeryAssetId: String,
    tags: [String],
    versions: [ImageGenerationVersionSchema],
    currentVersion: {
      type: Number,
      default: 0,
    },
    totalVersions: {
      type: Number,
      default: 0,
    },
    createdBy: String,
  },
  {
    timestamps: true,
  }
);

// Indexes
ImageGenerationSchema.index({ companyId: 1, status: 1 });
ImageGenerationSchema.index({ companyId: 1, createdAt: -1 });
ImageGenerationSchema.index({ createdAt: -1 }); // Standalone index for admin queries sorting by date

export const ImageGeneration = mongoose.model<IImageGeneration>('ImageGeneration', ImageGenerationSchema);