import { Sequelize, DataTypes, Model, Optional } from 'sequelize';
import { RoleMasterAttributes } from './role_master';

export interface UserAttributes {
    id: number;
    first_name?: string;
    last_name?: string;
    mobile?: string;
    role_id: number;
    email: string;
    token: string;
    isActive?: boolean;
    api_key?: string;
    api_key_created_at?: Date;
    api_key_last_used?: Date;
    staff_augmentation?: boolean;
    staff_augmentation_percentage?: number;
}

interface UserCreationAttributes extends Optional<UserAttributes, 'id'> {}

export class User
    extends Model<UserAttributes, UserCreationAttributes>
    implements UserAttributes 

{

    public static associate(models: any): void {
        User.belongsTo(models.RoleMaster, {
          foreignKey: 'role_id',
          as: 'RoleMaster',
        });

        User.hasMany(models.ProjectStaffing, {
        foreignKey: 'user_id',
        as: 'staffings',
    });
 
    }
    
    public id!: number;
    public username!: string;
    public first_name?: string;
    public last_name?: string;
    public mobile?: string;
    public password?: string;
    public email!: string;
    public role_id!: number;
    public token!: string;
    isActive?: boolean;
    public api_key?: string;
    public api_key_created_at?: Date;
    public api_key_last_used?: Date;
    public role_master?: RoleMasterAttributes;
    public staff_augmentation?: boolean;
    public staff_augmentation_percentage?: number;

    public toJSON(): UserAttributes & {
        role_master?: RoleMasterAttributes;
      }
      {
        return {
           ...super.toJSON(), // Include parent class serialization
            id: this.id,
            first_name: this.first_name,
            last_name: this.last_name,
            mobile: this.mobile,
            email: this.email,
            role_id: this.role_id,
            token: this.token,
            isActive: this.isActive,
            api_key: this.api_key,
            api_key_created_at: this.api_key_created_at,
            api_key_last_used: this.api_key_last_used,
            role_master: this.role_master,
            staff_augmentation: this.staff_augmentation,
            staff_augmentation_percentage: this.staff_augmentation_percentage,
        };
    }
 }


export default (sequelize: Sequelize, dataTypes: typeof DataTypes) => {
    User.init(
        {
            id: {
                type: dataTypes.INTEGER,
                autoIncrement: true,
                primaryKey: true,
            },
            first_name: {
                type: dataTypes.STRING,
                allowNull: false,
            },
            last_name: {
                type: dataTypes.STRING,
                allowNull: false,
            },
            mobile: {
                type: dataTypes.STRING
            },
            role_id: {
                type: dataTypes.INTEGER,
                allowNull: false,
                references: {
                    model: 'role_masters',
                    key: 'id'
                }
            },
            token: {
                type: dataTypes.STRING,
            },
            email: {
                type: dataTypes.STRING,
                allowNull: false,
                unique: true,
            },
            isActive: {
                type: dataTypes.BOOLEAN,
                defaultValue: true,
            },
            api_key: {
                type: dataTypes.STRING(64),
                allowNull: true,
                unique: true,
            },
            api_key_created_at: {
                type: dataTypes.DATE,
                allowNull: true,
            },
            api_key_last_used: {
                type: dataTypes.DATE,
                allowNull: true,
            },
            staff_augmentation: {
                type: DataTypes.BOOLEAN,
                allowNull: false,
                defaultValue: false,
              },
            staff_augmentation_percentage: {
                type: dataTypes.INTEGER,
                allowNull: true,
            },
        },
        {
            sequelize,
            modelName: 'User',
            tableName: 'Users',
            timestamps: true,
        }
    );

    User.associate = (models: any) => {
        User.belongsTo(models.RoleMaster, {
            foreignKey: 'role_id',
            targetKey: 'id',
        });

        User.hasMany(models.ProjectStaffing, {
            foreignKey: 'user_id',
            as: 'staffings',
        });
    };

    return User;
};