import { extensions } from "vscode";
import TelemetryReporter from "vscode-extension-telemetry";

// Borrowed from omnisharpServer.ts (omnisharp-vscode)
export class Delays {
    immediateDelays: number = 0;      // 0-25 milliseconds
    nearImmediateDelays: number = 0;  // 26-50 milliseconds
    shortDelays: number = 0;          // 51-250 milliseconds
    mediumDelays: number = 0;         // 251-500 milliseconds
    idleDelays: number = 0;           // 501-1500 milliseconds
    nonFocusDelays: number = 0;       // 1501-3000 milliseconds
    bigDelays: number = 0;            // 3000+ milliseconds
    private startTime: number = Date.now();
    public stop() {
        let endTime = Date.now();
        let elapsedTime = endTime - this.startTime;

        if (elapsedTime <= 25) {
            this.immediateDelays += 1;
        }
        else if (elapsedTime <= 50) {
            this.nearImmediateDelays += 1;
        }
        else if (elapsedTime <= 250) {
            this.shortDelays += 1;
        }
        else if (elapsedTime <= 500) {
            this.mediumDelays += 1;
        }
        else if (elapsedTime <= 1500) {
            this.idleDelays += 1;
        }
        else if (elapsedTime <= 3000) {
            this.nonFocusDelays += 1;
        }
        else {
            this.bigDelays += 1;
        }
    }
    public toMeasures(): { [key: string]: number } {
        return {
            immedateDelays: this.immediateDelays,
            nearImmediateDelays: this.nearImmediateDelays,
            shortDelays: this.shortDelays,
            mediumDelays: this.mediumDelays,
            idleDelays: this.idleDelays,
            nonFocusDelays: this.nonFocusDelays
        };
    }
}

const extensionId = "donjayamanne.python";
const extension = extensions.getExtension(extensionId);
const extensionVersion = extension.packageJSON.version;
const aiKey = "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217";
let reporter: TelemetryReporter;

/**
 * Sends a telemetry event
 * @param {string} eventName The event name
 * @param {object} properties An associative array of strings
 * @param {object} measures An associative array of numbers
 */
export function sendTelemetryEvent(eventName: string, properties?: {
    [key: string]: string;
}, measures?: {
    [key: string]: number;
}) {
    reporter = reporter ? reporter : new TelemetryReporter(extensionId, extensionVersion, aiKey);
    reporter.sendTelemetryEvent.apply(reporter, arguments);
}

