/**
 * AdBudget Model
 * Budget planning for ad campaigns
 */

import mongoose, { Document, Schema } from 'mongoose';

// ============================================
// TYPES
// ============================================

export type BidStrategy = 'manual-cpc' | 'enhanced-cpc' | 'target-cpa' | 'target-roas' | 'maximize-clicks' | 'maximize-conversions' | 'conversions' | 'conversion-value' | 'clicks' | 'impression-share';

export interface IBudgetAllocation {
  platform: string;
  percentage: number;
  dailyBudget?: number;
}

export interface IAdBudget extends Document {
  companyId: string;
  campaignId: string;
  audienceId?: string;
  name?: string;
  dailyBudget: number;
  totalBudget: number;
  currency?: string;
  bidStrategy: BidStrategy;
  targetCpc?: number;
  targetCpa?: number;
  targetRoas?: number;
  maxBid?: number;
  allocations?: IBudgetAllocation[];
  periodStart: string;
  periodEnd?: string;
  pacing?: 'even' | 'accelerated';
  notes?: string;
  createdAt: Date;
  updatedAt: Date;
}

// ============================================
// SUB-SCHEMAS
// ============================================

const BudgetAllocationSchema = new Schema({
  platform: { type: String, required: true },
  percentage: { type: Number, required: true, min: 0, max: 100 },
  dailyBudget: { type: Number },
}, { _id: false });

// ============================================
// MAIN SCHEMA
// ============================================

const AdBudgetSchema = new Schema<IAdBudget>({
  companyId: { type: String, required: [true, 'Company ID is required'] },
  campaignId: { type: String, required: [true, 'Campaign ID is required'], index: true },
  audienceId: { type: String },
  name: { type: String, trim: true },
  dailyBudget: { type: Number, required: [true, 'Daily budget is required'], min: 0 },
  totalBudget: { type: Number, required: [true, 'Total budget is required'], min: 0 },
  currency: { type: String, default: 'USD' },
  bidStrategy: {
    type: String,
    enum: ['manual-cpc', 'enhanced-cpc', 'target-cpa', 'target-roas', 'maximize-clicks', 'maximize-conversions', 'conversions', 'conversion-value', 'clicks', 'impression-share'],
    default: 'enhanced-cpc',
  },
  targetCpc: { type: Number, min: 0 },
  targetCpa: { type: Number, min: 0 },
  targetRoas: { type: Number, min: 0 },
  maxBid: { type: Number, min: 0 },
  allocations: [BudgetAllocationSchema],
  periodStart: { type: String, required: [true, 'Period start date is required'] },
  periodEnd: { type: String },
  pacing: {
    type: String,
    enum: ['even', 'accelerated'],
    default: 'even',
  },
  notes: { type: String, trim: true },
}, { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } });

// Indexes
AdBudgetSchema.index({ companyId: 1, campaignId: 1 });

export const AdBudget = mongoose.model<IAdBudget>('AdBudget', AdBudgetSchema);