import { mkdir } from "fs";

declare namespace TopJSFileSystem {

    export class TextFileStream {
        /**
         * 设置文件编码
         * @param iEncoding 
         */
        setCodec(iEncoding:string):void

        /**
         * 获取设置的文件编码
         */
        codec():string

        /**
         * 设置自动检测Unicode
         * @param iEnabled 
         */
        setAutoDetectUnicode(iEnabled:boolean):void

        /**
         * 是否自动检测Unicode
         */
        isAutoDetectUnicode():boolean

        /**
         * 设置是否添加编码BOM
         * @param iGenerated 
         */
        setGenerateByteOrderMark(iGenerated:boolean):void

        /**
         * 是否设置了自动添加BOM
         */
        isGenerateByteOrderMark():boolean

        /**
         * 设置是否每次在写入文件时自动刷新缓存至文件
         * @param iAutoFlush 
         */
        setAutoFlush(iAutoFlush:boolean):void

        /**
         * 是否每次在写入文件时自动刷新缓存至文件
         */
        isAutoFlush():boolean

        /**
         * 是否读取到文件结尾
         */
        atEnd():boolean

        /**
         * 将文件读取位置重置
         */
        reset():void

        /**
         * 刷新缓存至文件
         */
        flush():void

        /**
         * 寻找文件读取位置
         * @param iPos 
         */
        seek(iPos:Number):boolean

        /**
         * 获取当前文件读取位置
         */
        pos():Number

        /**
         * 设置自动忽略空格
         */
        skipWhiteSpace():void

        /**
         * 读取一行,iMaxLen为最大读取长度;iMaxLen=0表示不限制大小；
         * @param iMaxLen 
         */
        readLine(iMaxLen:Number=0):string

        /**
         * 读取全部文件内容
         */
        readAll():string

        /**
         * 读取指定大小文本块
         * @param iMaxLen 
         */
        read(iMaxLen:Number):string

        /**
         * 写入文件
         * @param iText 
         */
        write(iText:string):void

        /**
         * 关闭文件句柄
         */
        close():void
    }

    export class RawFileStream {
        /**
         * 设置是否每次在写入文件时自动刷新缓存至文件
         * @param iAutoFlush 
         */
        setAutoFlush(iAutoFlush:boolean):void

        /**
         * 是否每次在写入文件时自动刷新缓存至文件
         */
        isAutoFlush():boolean

        /**
         * 是否读取到文件结尾
         */
        atEnd():boolean

        /**
         * 将文件读取位置重置
         */
        reset():void

        /**
         * 刷新缓存至文件
         */
        flush():void

        /**
         * 寻找文件读取位置
         * @param iPos 
         */
        seek(iPos:Number):void

        /**
         * 获取当前文件读取位置
         */
        pos():Number


        /**
         * 读取全部文件内容
         */
        readAll():any

        /**
         * 读取指定大小文本块
         * @param iMaxLen 
         */
        read(iMaxLen:Number):any

        /**
         * 写入文件
         * @param iData
         */
        write(iData:any):void

        /**
         * 关闭文件句柄
         */
        close():void
    
    }

    export interface FileStat {
        type:'dir'|'file',
        isDir:boolean,
        isFile:boolean,
        path:string,
        dir:string,
        name:string,
        baseName:string,
        suffix:string,
        completeBaseName:string,
        completeSuffix:string,
        lastModified:string,
        lastRead:string,
        size:string,
        owner:string,
        ownerId:Number,
        group:string,
        groupId:Number,
        isSymbolLink:boolean,
        symbolLinkTarget:string,
        createTime:string,
        isExcutable:boolean,
        isHidden:boolean,
        isReadable:boolean,
        isWritable:boolean,
    }

    export interface WriteFileOptions {
        encoding:string,
        append:boolean,
        withbom:boolean,
    }

    /**
     * 找开一个文本文件
     * @param iFilePath 文件路径
     * @param iMode 打开方式; r=只读; w=只写; rw=读写; a=以追加模式只写; ra=以追加模式读写;
     */
    export function openFile(iFilePath:string, iMode:string='r'):TextFileStream;

    /**
     * 找开一个二进制文件
     * @param iFilePath 文件路径
     * @param iMode 打开方式;默认为只读; r=只读; w=只写; rw=读写; a=以追加模式只写; ra=以追加模式读写;
     */
    export function openRawFile(iFilePath:string, iMode:string='r'):RawFileStream;

    /**
     * 更改文件权限;
     * @param iPath 
     * @param iMode 文件权限;Linux文件权限码，如'777','644'
     */
    export function chmod(iPath:string, iMode:string):boolean
    
    /**
     * 复制文件, iOptions=false表示如果目标文件已经存在则不覆盖; 为true则强制覆盖；
     * @param iSrc 
     * @param iDest 
     * @param iOptions 
     */
    export function copyFile(iSrc:string, iDest:String, iOptions:any=false):boolean

    /**
     * 判断文件或文件夹是否存在,(任一一种存在都返回true)
     * @param iPath 
     */
    export function exists(iPath:string):boolean

    /**
     * 判断文件是否存在;
     * @param iPath 
     */
    export function fileExists(iPath:string):boolean

    /**
     * 判断文件夹是否存在;
     * @param iPath 
     */
    export function dirExists(iPath:string):boolean

    /**
     * link文件
     * @param iSrc 
     * @param iDest 
     */
    export function link(iSrc:string, iDest:string):boolean
    
    /**
     * 获取文件信息
     * @param iPath 
     */
    export function stat(iPath):FileStat

    /**
     * 创建一个文件夹
     * @param iPath 
     */
    export function mkdir(iPath:string):boolean
    
    /**
     * 获取文件的绝对路径
     * @param iPath 
     */
    export function realpath(iPath:string):string

    /**
     * 重命名或移动文件, iOptions=false表示如果目标文件已经存在则不覆盖; 为true则强制覆盖；
     * @param iOld 
     * @param iNew 
     * @param iOptions 
     */
    export function rename(iOld:string, iNew:string, iOptions:any=false):boolean

    /**
     * 删除文件, iOptions=true表示强制文件夹内的内容; 为false表示只有文件夹为空时才移除；
     * @param iOld 
     * @param iOptions 
     */
    export function rmdir(iDir:string, iOptions:any=true):boolean

    /**
     * 删除文件
     * @param iFile 
     */
    export function unlink(iFile:string):boolean

    /**
     * 获取文件夹下的文件信息列表,iRecursiveLevel表示递归查找多少级,-1表示无限递归,iChildrenKey代表用于表示子文件不会的Key; 如果为空则表示返回结果为一维数组;
     * @param iDir 
     * @param iRecursiveLevel 
     * @param iChildrenKey 
     */
    export function listDir(iDir:string, iRecursiveLevel:Number=-1, iChildrenKey:string=''):Array<FileStat>

    /**
     * 读取文本文件内容
     * @param iFile 
     * @param iCodec :文件编码，默认为UTF-8
     * @param iOptions :预留参数，暂时未使用
     */
    export function readFile(iFile:string, iCodec:string='UTF-8',iOptions:any):string
    
    /**
     * 写入一个文本文件
     * @param iFile 
     * @param iContent 
     * @param iOptions : 读写选项;默认为{encoding:'UTF-8', append:false, withbom:false}
     */
    export function writeFile(iFile:string, iContent:string, iOptions:WriteFileOptions={encoding:'UTF-8', append:false, withbom:false})

    /**
     * 获取操作系统临时目录
     */
    export function tmpdir():string

    /**
     * 获取操作系统当前用户HOME目录;
     */
    export function homedir():string

}

export = TopJSFileSystem;
