import argon2 from 'argon2';
import { z } from 'zod';

export default class Member {
    prefix = "MEMBER"
    indices = null

    constructor(indices) {
        this.indices = indices
    }

    schema = z.object({
        id: z.number(),
        email: z.string().email(),
        firstName: z.string(),
        lastName: z.string(),
        password: z.string(),
        created: z.string()
    })

    isHashed = (s) => {return s.startsWith("$argon2")}

    async add(newMember, network = null) {
        const hash = await argon2.hash(newMember.password);
        newMember.password = hash

        try {
            global.db.addNode(this.prefix, newMember)
            if(network) {
                global.db.edge.add({
                    type: "IN",
                    from: `${this.prefix}-${global.db.getCurrentIndex(this)}`,
                    to: "NETWORK-1"
                })
            }
        } catch(e) {
            console.error(e)
            throw new global.ServerError(400, "Failed to add member!");
        }
    }

    get(id) {
        return this.entries[this.ids[id]]
    }

    getByEmail(email) {
        for(let i=this.indices[0]; i<this.indices[1]; i++) {
            if(global.db.nodes[i].email === email) {
                return global.db.nodes[i]
            }
        }
        return null
    }

    getIDFromEmail(email) {
        let index = 0
        for(let i=0; i<this.entries.length; i++) {
            if(this.entries[i].email === email) {
                index = i
                break
            }
        }
        return Object.entries(this.ids)[index][0]
    }
}