import {NetworkProxy} from "../../../drivers/network/typings"
import {IStorage} from "../../../drivers/storage/typings"
import {INudgesRepository, Nudge} from "./typings"
import {NudgeScreenType} from "../../commonTypes";
import {getLocalStorageUserId} from "../../../drivers/CfSystem";

const SHOWN_NUDGES = 'cfLog-shown-nudges'

export default class NudgesRepository implements INudgesRepository{
    private apiURL
    private networkDriver
    private storageDriver

    public constructor(url: string, bsNetwork: NetworkProxy, storageDriver: IStorage) {
        this.apiURL = url
        this.networkDriver = bsNetwork
        this.storageDriver = storageDriver
    }

    public markNudgeAsShown = (nudgeId: string): void => {
        const shownNudges = JSON.parse(this.storageDriver.get(SHOWN_NUDGES)) || []
        shownNudges.push(nudgeId)
        this.storageDriver.save(SHOWN_NUDGES, JSON.stringify(shownNudges))
    }

    public haveBeenAlreadyShown = (nudgeId: string): boolean => {
        const shownNudges = JSON.parse(this.storageDriver.get(SHOWN_NUDGES)) || []
        return shownNudges.includes(nudgeId)
    }

    public getNudges = async (userId: string, nudgeScreenType : NudgeScreenType): Promise<Nudge[]> => {

        const userIdValue = userId || getLocalStorageUserId()

        if(!userIdValue){
            return []
        }

        let url = `${this.apiURL}/${userIdValue}`

        if(nudgeScreenType !== NudgeScreenType.None){
            url += `?render_page=${nudgeScreenType}`
        }

        const listOfNudges = (await this.networkDriver.get(`${url}`)) || []

        return listOfNudges
    }
}
