import * as fs from 'fs';
import * as fse from 'fs-extra';
import * as tls from 'tls';
import got_ from 'got';

export const got = got_.extend({ca: [...tls.rootCertificates]});

export function checkDir(path: string) {
    return new Promise(resolve => fs.mkdir(path, resolve));
}

export function writeFile(path: string, data: string) {
    return new Promise<void>((resolve, reject) => {
        fs.writeFile(path, data, {encoding: 'utf-8'}, err => {
            if (err) {
                reject(err);
            } else {
                resolve();
            }
        });
    });
}

export function readFile(path: string) {
    return new Promise<string>((resolve, reject) => {
        fs.readFile(path, (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve(data.toString('utf-8'));
            }
        });
    });
}

export function moveFile(oldPath: string, newPath: string) {
    return fse.move(oldPath, newPath);
}

export function readDir(path: string) {
    return new Promise<string[]>((resolve, reject) => {
        fs.readdir(path, (err, files) => {
            if (err) {
                reject(err);
            } else {
                resolve(files);
            }
        });
    });
}

export function removeFile(path: string) {
    return new Promise(resolve => {
        fs.unlink(path, resolve);
    });
}

export function removeDir(path: string) {
    return fse.remove(path);
}

export function fileExists(path: string): Promise<boolean> {
    return new Promise(resolve => {
        fs.exists(path, resolve);
    });
}

export function isDirEmpty(path: string): Promise<boolean> {
    return new Promise((resolve, reject) => {
        fs.readdir(path, (err, files) => {
            if (err) {
                reject(err);
            } else {
                resolve(files.length === 0);
            }
        });
    });
}

export function TTRSSApiURL(server_url: string) {
    return server_url.endsWith('/') ? server_url + 'api/' : server_url + '/api/';
}

export function *walkFeedTree(tree: FeedTree): Generator<string> {
    for (const item of tree) {
        if (typeof(item) === 'string') {
            yield item;
        } else {
            for (const feed of walkFeedTree(item.list)) {
                yield feed;
            }
        }
    }
}