import { Sequelize, DataTypes, Optional, Model } from "sequelize";

interface UserAttributes {
    id: number;
    username: string;
    password: string;
    nickname: string;
    email: string;
    avatar: string;
    tel: string;
    createdAt?: Date;
    updatedAt?: Date;
    deletedAt?: Date;
}

export interface UserInput extends Optional<UserAttributes, "id"> { }
export interface UserOutput extends Required<UserAttributes> { }
export type TUserModel = ReturnType<typeof UserModel>

export default function UserModel(sequelize: Sequelize) {
    interface UserInstance
        extends Model<UserAttributes, UserInput>,
        UserAttributes { }

    const User = sequelize.define<UserInstance>("user", {
        id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true,
        },
        username: {
            type: DataTypes.STRING,
            allowNull: false,
        },
        password: {
            type: DataTypes.STRING,
            allowNull: false,
        },
        nickname: {
            type: DataTypes.STRING,
            allowNull: false,
        },
        email: {
            type: DataTypes.STRING,
        },
        avatar: {
            type: DataTypes.STRING,
        },
        tel: {
            type: DataTypes.STRING,
        },
    }, {
        underscored: true,
        deletedAt: true,
        paranoid: true,
        timestamps: true,
    });

    User.prototype.toJSON = function () {
        const values = { ...this.get() } as UserAttributes;
        delete values.password;
        delete values.deletedAt;
        return values;
    };

    User.associate = function (models) {
        // Define associations here
    };

    return User;
}