import * as plugins from '../plugins.js';

@plugins.smartdata.managed()
export class User extends plugins.smartdata.SmartDataDbDoc<
  User,
  plugins.servezoneInterfaces.data.IUser
> {
  /**
   * creates a machine user
   */
  public static async createMachineUser(userNameArg: string, roleArg: 'api' | 'cluster') {
    const user = new User();
    user.id = await User.getNewId();
    user.data = {
      type: 'machine',
      username: userNameArg,
      tokens: [
        {
          token: 'machineUser',
          expiresAt: Date.now() + 3600 * 1000 * 24 * 365,
          assignedRoles: ['admin'],
        },
      ],
      role: 'api',
    };
    await user.save();
    return user;
  }

  public static async findUserByUsernameAndPassword(usernameArg: string, passwordArg: string) {
    return await User.getInstance({
      data: {
        username: usernameArg,
        password: passwordArg,
      },
    });
  }

  constructor(optionsArg?: plugins.servezoneInterfaces.data.IUser) {
    super();
    if (optionsArg) {
      Object.assign(this, optionsArg);
    }
  }

  // INSTANCE
  @plugins.smartdata.unI()
  public id: string;

  @plugins.smartdata.svDb()
  public data: plugins.servezoneInterfaces.data.IUser['data'];
}