/*!
 * Copyright 2016 The ANTLR Project. All rights reserved.
 * Licensed under the BSD-3-Clause license. See LICENSE file in the project root for license information.
 */

// ConvertTo-TS run at 2016-10-04T11:26:41.8188111-07:00

export class LogManager {
    protected static class Record {
		let timestamp: number; 
		let location: StackTraceElement; 
		let component: string; 
		let msg: string; 
		public Record() {
			timestamp = System.currentTimeMillis();
			location = new Throwable().getStackTrace()[0];
		}

		@Override
		toString(): string {
            let buf: StringBuilder =  new StringBuilder();
            buf.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date(timestamp)));
            buf.append(" ");
            buf.append(component);
            buf.append(" ");
            buf.append(location.getFileName());
            buf.append(":");
            buf.append(location.getLineNumber());
            buf.append(" ");
            buf.append(msg);
            return buf.toString();
		}
	}

	protected records: List<Record>; 

	log(@Nullable component: string, msg: string): void {
		let r: Record =  new Record();
		r.component = component;
		r.msg = msg;
		if ( records==null ) {
			records = new ArrayList<Record>();
		}
		records.add(r);
	}

    log(String msg) { log(null,  msg): void; }

    save(filename: string): void {
        let fw: FileWriter =  new FileWriter(filename);
        let bw: BufferedWriter =  new BufferedWriter(fw);
        try {
            bw.write(toString());
        }
        finally {
            bw.close();
        }
    }

    save(): string {
        //String dir = System.getProperty("java.io.tmpdir");
        let dir: string =  ".";
        let defaultFilename: string = 
            dir + "/antlr-" +
            SimpleDateFormat("yyyy-MM-dd-HH.mm.ss").format(new Date()): new + ".log";
        save(defaultFilename);
        return defaultFilename;
    }

    @Override
    toString(): string {
        if ( records==null ) return "";
        let nl: string =  System.getProperty("line.separator");
        let buf: StringBuilder =  new StringBuilder();
        for (let r of records) {
            buf.append(r);
            buf.append(nl);
        }
        return buf.toString();
    }

    static main(args: string[]): void {
        let mgr: LogManager =  new LogManager();
        mgr.log("atn", "test msg");
        mgr.log("dfa", "test msg 2");
        console.log(mgr);
        mgr.save();
    }
}
