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

export interface IRelative {
  memberId: mongoose.Types.ObjectId;
  relationship: 'spouse' | 'child' | 'parent' | 'sibling' | 'other';
}

export interface IMemberHistory {
  changeType: string;
  details: string;
  date: Date;
  actorName: string;
}

export interface IMember extends Document {
  memberUuid: string;
  name: string;
  gender: string;
  mobile: string;
  altMobile: string;
  email: string;
  address: string;
  countryId: mongoose.Types.ObjectId;
  stateId: mongoose.Types.ObjectId;
  cityId: mongoose.Types.ObjectId;
  areaId: mongoose.Types.ObjectId;
  assignedCenterId?: mongoose.Types.ObjectId;
  assignedInchargeId?: mongoose.Types.ObjectId; // References User
  status: 'Visitor' | 'Regular Attendee' | 'Member' | 'Inactive';
  joiningDate: Date;
  familyId?: string; // Common UUID grouping family/household
  relatives: IRelative[];
  history: IMemberHistory[];
  appreciations: string[];
  isActive: boolean;
  createdAt: Date;
  updatedAt: Date;
}

const RelativeSchema = new Schema<IRelative>({
  memberId: { type: Schema.Types.ObjectId, ref: 'Member', required: true },
  relationship: {
    type: String,
    enum: ['spouse', 'child', 'parent', 'sibling', 'other'],
    required: true
  }
});

const MemberHistorySchema = new Schema<IMemberHistory>({
  changeType: { type: String, required: true },
  details: { type: String, required: true },
  date: { type: Date, default: Date.now },
  actorName: { type: String, required: true }
});

const MemberSchema = new Schema<IMember>({
  memberUuid: { type: String, required: true, unique: true },
  name: { type: String, required: true, trim: true },
  gender: { type: String, required: true, trim: true },
  mobile: { type: String, trim: true, default: '' },
  altMobile: { type: String, trim: true, default: '' },
  email: { type: String, lowercase: true, trim: true, default: '' },
  address: { type: String, trim: true, default: '' },
  countryId: { type: Schema.Types.ObjectId, ref: 'Country', required: true },
  stateId: { type: Schema.Types.ObjectId, ref: 'State', required: true },
  cityId: { type: Schema.Types.ObjectId, ref: 'City', required: true },
  areaId: { type: Schema.Types.ObjectId, ref: 'Area', required: true },
  assignedCenterId: { type: Schema.Types.ObjectId, ref: 'SatsangCenter' },
  assignedInchargeId: { type: Schema.Types.ObjectId, ref: 'User' },
  status: {
    type: String,
    enum: ['Visitor', 'Regular Attendee', 'Member', 'Inactive'],
    required: true,
    default: 'Visitor'
  },
  joiningDate: { type: Date, default: Date.now },
  familyId: { type: String, index: true },
  relatives: { type: [RelativeSchema], default: [] },
  history: { type: [MemberHistorySchema], default: [] },
  appreciations: { type: [String], default: [] },
  isActive: { type: Boolean, default: true }
}, {
  timestamps: true
});

// Indexes for query performance and search
MemberSchema.index({ mobile: 1 });
MemberSchema.index({ name: 'text' });
MemberSchema.index({ cityId: 1, areaId: 1, isActive: 1 });

export const Member: Model<IMember> = mongoose.models.Member || mongoose.model<IMember>('Member', MemberSchema);
export default Member;
