import User from '../models/User';
import db   from '../helpers/DatabaseHelper';


class UserManager {
    private static _instance: UserManager;

    private constructor() { }

    public static get instance(): UserManager {
        if ( !UserManager._instance ) {
            UserManager._instance = new UserManager();
        }

        return UserManager._instance;
    }

    createObjectFromRawSql(raw: any): User {
        return User.createFromSql(raw);
    }

    async getByMail(mail: string): Promise<User | undefined> {
        const raw = await db<User>(User.tableName).where('userMail', mail).first();

        return raw ? this.createObjectFromRawSql(raw) : undefined;
    }

    async getById(id: number): Promise<User | undefined> {
        const raw = await db<User>(User.tableName).where('userID', id).first();

        return raw ? this.createObjectFromRawSql(raw) : undefined;
    }

    async getByIds(ids: Array<number>): Promise<Array<User>> {
        return Promise.all(ids.map(userId => this.getById(userId)));
    }

    async getByGitlabId(gitlabId: number): Promise<User | number> {
        const raw = await db<User>(User.tableName).where('userGitlabId', gitlabId).first();

        return raw ? this.createObjectFromRawSql(raw) : gitlabId;
    }

    async getByGitlabIds(gitlabIds: Array<number>): Promise<Array<User | number>> {
        return Promise.all(gitlabIds.map(gitlabId => this.getByGitlabId(gitlabId)));
    }
}


export default UserManager.instance;