import { PackageType } from "../types/types";
import { toImageUrl } from "../utils/imageUrl";

const mongoose = require("mongoose");

const User = mongoose.Schema(
  {
    name: {
      type: String,
      default: "",
      required: true,
    },
    email: {
      type: String,
      default: "",
      required: true,
    },
    password: {
      type: String,
      default: "",
      required: false,
    },
    token: {
      type: String,
      default: "",
      required: false,
    },
    loginProvider: {
      type: String,
      default: "",
      required: true,
    },
    appleUserId: {
      type: String,
      default: "",
      required: false,
    },
    role: {
      type: String,
      default: "",
      required: true,
    },
    streetAddress: {
      type: String,
      default: "",
      required: false,
    },
    apartmentNumber: {
      type: String,
      default: "",
      required: false,
    },
    city: {
      type: String,
      default: "",
      required: false,
    },
    state: {
      type: String,
      default: "",
      required: false,
    },
    postalCode: {
      type: String,
      default: "",
      required: false,
    },
    country: {
      type: String,
      default: "",
      required: false,
    },
    phoneNumber: {
      type: String,
      default: "",
      required: false,
    },
    countryCode: {
      type: String,
      default: "",
      required: false,
    },
    emailVerified: {
      type: Boolean,
      default: false,
      required: false,
    },
    stripeCustomerId: {
      type: String,
      default: "",
      required: false,
    },
    stripeAccountId: {
      type: String,
      required: false,
    },
    FCMToken: {
      type: String,
      default: "",
      required: false,
    },
    activePackage: {
      type: String,
      default: PackageType.free,
      required: false,
    },
    packageExpiryDate: {
      type: Date,
      required: false,
    },
    lastLogin: {
      type: Date,
      required: false,
    },
    status: {
      type: String,
      default: "Active",
      required: false,
    },
    signature: {
      type: String,
      required: false,
    },
    profileImage: {
      type: String,
      default: "",
      required: false,
    },
    birthday: {
      type: Date,
      default: null,
      required: false,
    },
    anniversary: {
      type: Date,
      default: null,
      required: false,
    },
  },
  { timestamps: true }
);

//
// The same transform also expands profileImage. The database stores only the
// S3 key (e.g. "btd-profile/1739-photo.jpg"); here it is converted to the full
// public URL so every response (login, /user/me, update, listings) returns a
// ready-to-use image link.
const transformUser = (_doc: any, ret: any) => {
  delete ret.password;
  if (ret.profileImage) ret.profileImage = toImageUrl(ret.profileImage);
  return ret;
};
User.set("toJSON", { transform: transformUser });
User.set("toObject", { transform: transformUser });

export default mongoose.model("User", User);
