import CookieStore from './CookieStore';
import Cookie from './Cookie';
import * as Redis from 'redis';

export default class MemoryStore implements CookieStore {
    private redis: Redis.RedisClient;
    constructor(uri: string, private prefix: string) {
        this.redis = Redis.createClient(uri);
    }

    async get(key: string): Promise<Cookie> {
        return new Promise<Cookie>((resolve, reject) => {
            this.redis.get(this.prefix + key, (err, result) => {
                if (err) return reject(err);
                const cookie = new Cookie();
                const data = JSON.parse(result)
                if (!data) return resolve(cookie);
                cookie.key = data.key;
                cookie.expires = new Date(data.expires);
                cookie.data = data.data;
                cookie.path = data.path;
                cookie.domain = data.domain;
                cookie.secure = data.secure ? true : false;
                cookie.httpOnly = data.httpOnly ? true : false;
                resolve(cookie);
            });
        });
    }
    async set(cookie: Cookie): Promise<void> {
        return new Promise<void>((resolve, reject) => {
            this.redis.setex(
                this.prefix + cookie.key,
                Math.round((cookie.expires.getTime() - Date.now()) / 1000),
                JSON.stringify(cookie),
                err => {
                    if (err) return reject(err);
                    resolve();
                });
        });
    }
    async remove(cookie: Cookie): Promise<void> {
        return new Promise<void>((resolve, reject) => {
            this.redis.del(this.prefix + cookie.key, err => {
                if (err) return reject(err);
                resolve();
            });
        });
    }
}
