// server/models/member.js
import mongoose from "mongoose";
import { resolve } from "path";
import { fileURLToPath } from "url";

const __dirname = fileURLToPath(new URL(".", import.meta.url));

// Import configs using dynamic imports to avoid build issues
const getValidCircleValues = () => ["community", "founder", "practitioner"];
const getValidContributionValues = () => ["0", "5", "15", "30", "50"];

const memberSchema = new mongoose.Schema({
  email: { type: String, required: true, unique: true },
  emailHistory: [
    {
      email: { type: String, required: true },
      changedAt: { type: Date, default: Date.now },
    },
  ],
  name: { type: String, required: true },
  circle: {
    type: String,
    enum: getValidCircleValues(),
    required: true,
  },
  contributionTier: {
    type: String,
    enum: getValidContributionValues(),
    required: true,
  },
  role: {
    type: String,
    enum: ["member", "admin"],
    default: "member",
  },
  status: {
    type: String,
    enum: ["pending_payment", "active", "suspended", "cancelled"],
    default: "pending_payment",
  },
  helcimCustomerId: String,
  helcimSubscriptionId: String,
  paymentMethod: {
    type: String,
    enum: ["card", "bank", "none"],
    default: "none",
  },
  subscriptionStartDate: Date,
  subscriptionEndDate: Date,
  nextBillingDate: Date,
  slackInvited: { type: Boolean, default: false },
  slackInviteStatus: {
    type: String,
    enum: ["pending", "sent", "failed", "accepted", "joined"],
    default: "pending",
  },
  slackUserId: String,

  // Profile fields
  pronouns: String,
  timeZone: String,
  avatar: String,
  studio: String,
  bio: String,
  location: String,
  socialLinks: {
    mastodon: String,
    linkedin: String,
    website: String,
    other: String,
  },
  offering: {
    text: String,
    tags: [String],
  },
  lookingFor: {
    text: String,
    tags: [String],
  },
  showInDirectory: { type: Boolean, default: true },

  // Peer support settings
  peerSupport: {
    enabled: { type: Boolean, default: false },
    skillTopics: [String], // Auto-populated from offering.tags, editable
    supportTopics: [String], // Curated conversational/emotional support topics
    availability: String,
    personalMessage: String,
    slackUsername: String,
    slackDMChannelId: String, // DM channel ID for direct messaging
  },

  craftTags: [String],
  communityConnections: {
    topics: [
      {
        tagSlug: String,
        state: { type: String, enum: ['help', 'interested', 'seeking'] },
      },
    ],
    offerPeerSupport: { type: Boolean, default: false },
    availability: String,
    slackHandle: String,
    personalMessage: String,
    details: String,
  },

  // Privacy settings for profile fields
  privacy: {
    pronouns: {
      type: String,
      enum: ["public", "members", "private"],
      default: "members",
    },
    timeZone: {
      type: String,
      enum: ["public", "members", "private"],
      default: "members",
    },
    avatar: {
      type: String,
      enum: ["public", "members", "private"],
      default: "public",
    },
    studio: {
      type: String,
      enum: ["public", "members", "private"],
      default: "members",
    },
    bio: {
      type: String,
      enum: ["public", "members", "private"],
      default: "members",
    },
    location: {
      type: String,
      enum: ["public", "members", "private"],
      default: "members",
    },
    socialLinks: {
      type: String,
      enum: ["public", "members", "private"],
      default: "members",
    },
    offering: {
      type: String,
      enum: ["public", "members", "private"],
      default: "members",
    },
    lookingFor: {
      type: String,
      enum: ["public", "members", "private"],
      default: "members",
    },
    craftTags: {
      type: String,
      enum: ["public", "members", "private"],
      default: "members",
    },
    communityConnections: {
      type: String,
      enum: ["public", "members", "private"],
      default: "members",
    },
  },

  notifications: {
    events: { type: Boolean, default: true },
    updates: { type: Boolean, default: true },
    peerRequests: { type: Boolean, default: true },
    connectionRequests: { type: Boolean, default: true },
  },

  inviteEmailSent: { type: Boolean, default: false },
  inviteEmailSentAt: Date,

  // Magic link single-use enforcement
  magicLinkJti: String,
  magicLinkJtiUsed: { type: Boolean, default: false },

  // Session revocation via token versioning
  tokenVersion: { type: Number, default: 0 },

  createdAt: { type: Date, default: Date.now },
  lastLogin: Date,
});

// Check if model already exists to prevent re-compilation in development
export default mongoose.models.Member || mongoose.model("Member", memberSchema);
