import {
  Sequelize,
  DataTypes,
  Model,
  InferAttributes,
  InferCreationAttributes,
  CreationOptional,
} from "sequelize";
import type { UserRole } from "@/types";

export class User extends Model<
  InferAttributes<User>,
  InferCreationAttributes<User>
> {
  declare id: CreationOptional<string>;
  declare name: string;
  declare email: string;
  declare passwordHash: string | null;
  declare role: UserRole;
  declare workspaceId: string | null;
  declare avatarUrl: string | null;
  declare isActive: CreationOptional<boolean>;
  declare lastLoginAt: Date | null;
  declare createdAt: CreationOptional<Date>;
  declare updatedAt: CreationOptional<Date>;
}

export function initUserModel(sequelize: Sequelize) {
  User.init(
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
      },
      name: { type: DataTypes.STRING(255), allowNull: false },
      email: { type: DataTypes.STRING(255), allowNull: false, unique: true },
      passwordHash: { type: DataTypes.STRING(255), allowNull: true },
      role: {
        type: DataTypes.ENUM("super_admin", "client", "respondent"),
        allowNull: false,
        defaultValue: "client",
      },
      workspaceId: { type: DataTypes.UUID, allowNull: true },
      avatarUrl: { type: DataTypes.STRING(512), allowNull: true },
      isActive: {
        type: DataTypes.BOOLEAN,
        allowNull: false,
        defaultValue: true,
      },
      lastLoginAt: { type: DataTypes.DATE, allowNull: true },
      createdAt: DataTypes.DATE,
      updatedAt: DataTypes.DATE,
    },
    { sequelize, modelName: "User", tableName: "Users" }
  );
  return User;
}

/** Safe user shape for API/session — never includes passwordHash. */
export type SafeUser = Pick<
  User,
  | "id"
  | "name"
  | "email"
  | "role"
  | "workspaceId"
  | "avatarUrl"
  | "isActive"
  | "lastLoginAt"
>;
