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

export interface IUserAssignment {
  scopeType: 'global' | 'city' | 'area';
  targetId: mongoose.Types.ObjectId; // References City or Area depending on scopeType
  validFrom: Date;
  validTo?: Date;
  isActive: boolean;
}

export interface IUser extends Document {
  email: string;
  passwordHash: string;
  role: 'SUPER_ADMIN' | 'CITY_HEAD' | 'AREA_INCHARGE' | 'MEMBER';
  memberId?: mongoose.Types.ObjectId; // References Member collection
  isActive: boolean;
  assignments: IUserAssignment[];
  publicContactEmail?: string;
  publicContactMobile?: string;
  createdAt: Date;
  updatedAt: Date;
}

const UserAssignmentSchema = new Schema<IUserAssignment>({
  scopeType: {
    type: String,
    enum: ['global', 'city', 'area'],
    required: true
  },
  targetId: {
    type: Schema.Types.ObjectId,
    required: true
  },
  validFrom: {
    type: Date,
    required: true,
    default: Date.now
  },
  validTo: {
    type: Date
  },
  isActive: {
    type: Boolean,
    required: true,
    default: true
  }
});

const UserSchema = new Schema<IUser>({
  email: {
    type: String,
    required: true,
    unique: true,
    lowercase: true,
    trim: true,
    validate: {
      validator: function(v: string) {
        // Enforce administrative email domain in validation for V1 admins,
        // but let's allow other emails if role is MEMBER
        if (v.endsWith('@geetashyam.guru')) {
          return true;
        }
        // Admin roles MUST have @geetashyam.guru
        return false;
      },
      message: (props) => `${props.value} is not a valid @geetashyam.guru administrative email address.`
    }
  },
  passwordHash: { type: String, required: true },
  role: {
    type: String,
    enum: ['SUPER_ADMIN', 'CITY_HEAD', 'AREA_INCHARGE', 'MEMBER'],
    required: true,
    default: 'MEMBER'
  },
  memberId: { type: Schema.Types.ObjectId, ref: 'Member' },
  isActive: { type: Boolean, default: true },
  assignments: { type: [UserAssignmentSchema], default: [] },
  publicContactEmail: { type: String, trim: true, lowercase: true, default: '' },
  publicContactMobile: { type: String, trim: true, default: '' }
}, {
  timestamps: true
});

export const User: Model<IUser> = mongoose.models.User || mongoose.model<IUser>('User', UserSchema);
export default User;
