import mongoose, { Schema, Document, Model } from 'mongoose';

export interface IGeographyTarget {
  scopeType: 'Country' | 'State' | 'City' | 'Area';
  targetId: mongoose.Types.ObjectId;
}

export interface IAnnouncementAudience {
  geographyTargets: IGeographyTarget[];
  centerTargets: mongoose.Types.ObjectId[]; // References SatsangCenter
  roleFilters: string[]; // Roles like ['CITY_HEAD', 'AREA_INCHARGE']
}

export interface IAnnouncement extends Document {
  title: string;
  message: string;
  priority: 'Normal' | 'Important' | 'Urgent';
  isGlobal: boolean;
  audience: IAnnouncementAudience;
  publishDateTime: Date;
  expiryDateTime?: Date;
  status: 'Active' | 'Archived';
  createdBy: mongoose.Types.ObjectId; // References User
  createdAt: Date;
  updatedAt: Date;
}

const GeographyTargetSchema = new Schema<IGeographyTarget>({
  scopeType: { type: String, enum: ['Country', 'State', 'City', 'Area'], required: true },
  targetId: { type: Schema.Types.ObjectId, required: true }
}, { _id: false });

const AnnouncementAudienceSchema = new Schema<IAnnouncementAudience>({
  geographyTargets: { type: [GeographyTargetSchema], default: [] },
  centerTargets: { type: [Schema.Types.ObjectId], ref: 'SatsangCenter', default: [] },
  roleFilters: { type: [String], default: [] }
}, { _id: false });

const AnnouncementSchema = new Schema<IAnnouncement>({
  title: { type: String, required: true, trim: true },
  message: { type: String, required: true, trim: true },
  priority: {
    type: String,
    enum: ['Normal', 'Important', 'Urgent'],
    required: true,
    default: 'Normal'
  },
  isGlobal: { type: Boolean, required: true, default: false },
  audience: { type: AnnouncementAudienceSchema, default: () => ({}) },
  publishDateTime: { type: Date, required: true, default: Date.now },
  expiryDateTime: { type: Date },
  status: {
    type: String,
    enum: ['Active', 'Archived'],
    required: true,
    default: 'Active'
  },
  createdBy: { type: Schema.Types.ObjectId, ref: 'User', required: true }
}, {
  timestamps: true
});

// Indexes for feed retrieval and lifecycle filtering
AnnouncementSchema.index({ isGlobal: 1, 'audience.geographyTargets.targetId': 1, 'audience.geographyTargets.scopeType': 1, publishDateTime: -1 }, { name: 'feed_geography_idx' });
AnnouncementSchema.index({ 'audience.centerTargets': 1, publishDateTime: -1 }, { name: 'feed_centers_idx' });
AnnouncementSchema.index({ publishDateTime: -1, expiryDateTime: 1 }, { name: 'lifecycle_filter_idx' });

export const Announcement: Model<IAnnouncement> =
  mongoose.models.Announcement || mongoose.model<IAnnouncement>('Announcement', AnnouncementSchema);
export default Announcement;
