import Member from "../../models/member.js";
import { requireAuth } from "../../utils/auth.js";
import { validateBody } from "../../utils/validateBody.js";
import { memberProfileUpdateSchema } from "../../utils/schemas.js";

export default defineEventHandler(async (event) => {
  const authedMember = await requireAuth(event);
  const memberId = authedMember._id;

  const body = await validateBody(event, memberProfileUpdateSchema);

  // Profile fields from validated body
  const profileFields = [
    "pronouns",
    "timeZone",
    "avatar",
    "studio",
    "bio",
    "location",
    "socialLinks",
    "showInDirectory",
    "notifications",
  ];

  // Build update object from validated data
  const updateData = {};

  profileFields.forEach((field) => {
    if (body[field] !== undefined) {
      updateData[field] = body[field];
    }
  });

  // Handle craftTags (simple array)
  if (body.craftTags !== undefined) {
    updateData.craftTags = body.craftTags;
  }

  // Handle board slack handle
  if (body.boardSlackHandle !== undefined) {
    updateData["board.slackHandle"] = body.boardSlackHandle;
  }

  try {
    const member = await Member.findByIdAndUpdate(
      memberId,
      { $set: updateData },
      { new: true, runValidators: true },
    );

    if (!member) {
      throw createError({
        statusCode: 404,
        statusMessage: "Member not found",
      });
    }

    // Log which fields were updated
    const changedFields = Object.keys(body).filter(k => body[k] !== undefined)
    if (changedFields.length) {
      logActivity(memberId, 'profile_updated', { fields: changedFields })
    }

    // Return sanitized member data
    return {
      id: member._id,
      email: member.email,
      name: member.name,
      circle: member.circle,
      contributionAmount: member.contributionAmount,
      pronouns: member.pronouns,
      timeZone: member.timeZone,
      avatar: member.avatar,
      studio: member.studio,
      bio: member.bio,
      location: member.location,
      socialLinks: member.socialLinks,
      craftTags: member.craftTags,
      showInDirectory: member.showInDirectory,
      notifications: member.notifications,
    };
  } catch (error) {
    if (error.statusCode) throw error;
    console.error("Profile update error:", error);
    throw createError({
      statusCode: 500,
      statusMessage: "Failed to update profile",
    });
  }
});
