/**
 * 用户 DTO
 */
import {
  UserSchema,
  type UserInput,
  type UserData,
} from "@/data/schemas/user/user";
import { PersonalityTraits } from "./personality_traits";

export class User {
  declare readonly id: string;
  declare readonly username: string;
  declare readonly email: string;
  declare readonly platform: string;
  declare readonly country: string;
  declare readonly countryCode: string;
  declare readonly intimacy: number;
  declare readonly dolBalance: number;
  declare readonly personalityTraits: PersonalityTraits;
  declare readonly preferredLanguage: string;
  declare readonly createdAt: string;
  declare readonly lastMessageAt: string;

  private constructor(input: UserInput) {
    const data = UserSchema.parse(input);
    Object.assign(this, {
      ...data,
      personalityTraits: PersonalityTraits.from(data.personalityTraits),
    });
    Object.freeze(this);
  }

  static from(input: UserInput): User {
    return new User(input);
  }

  static fromJson(json: unknown): User {
    return User.from(json as UserInput);
  }

  /**
   * 创建一个具有空 id/username 的 User 实例（用于可选 user 字段的默认占位）
   */
  static empty(): User {
    return new User({ id: "", username: "" });
  }

  toJson(): UserData {
    const { personalityTraits, ...rest } = this;
    return {
      ...rest,
      personalityTraits: personalityTraits.toJson(),
    };
  }
}
