import { MatrixClient } from "./MatrixClient";
import { SynapseAdminApis } from "./SynapseAdminApis";

/**
 * Whois information about a user.
 * See https://matrix.org/docs/spec/client_server/r0.5.0#get-matrix-client-r0-admin-whois-userid for more information.
 * @category Admin APIs
 */
export interface WhoisInfo {
    user_id: string;
    devices: {
        [device_id: string]: {
            sessions: [{
                connections: WhoisConnectionInfo[];
            }];
        };
    };
}

interface WhoisConnectionInfo {
    /**
     * Most recently seen IP address of the session.
     */
    ip: string;

    /**
     * Unix timestamp that the session was last active.
     */
    last_seen: number;

    /**
     * User agent string last seen in the session.
     */
    user_agent: string;
}

/**
 * Access to various administrative APIs.
 * @category Admin APIs
 */
export class AdminApis {
    constructor(private client: MatrixClient) {
    }

    /**
     * Gets access to the Synapse administrative APIs object.
     */
    public get synapse(): SynapseAdminApis {
        return new SynapseAdminApis(this.client);
    }

    /**
     * Gets information about a particular user.
     * @param {string} userId the user ID to lookup
     * @returns {Promise<WhoisInfo>} resolves to the whois information
     */
    public whoisUser(userId: string): Promise<WhoisInfo> {
        return this.client.doRequest("GET", "/_matrix/client/v3/admin/whois/" + encodeURIComponent(userId));
    }
}
