/**
 * TypeScript declarations for the 'asterisk-manager' library
 */
declare module "asterisk-manager" {
  import { EventEmitter } from "events";

  interface AmiAction {
    action: string;
    [key: string]: string | number | boolean | undefined;
  }

  interface AmiResponse {
    response?: string;
    message?: string;
    actionid?: string;
    [key: string]: unknown;
  }

  interface AmiEvent {
    event: string;
    [key: string]: unknown;
  }

  type AmiCallback = (err: Error | null, res: AmiResponse) => void;
  type EventCallback = (event: AmiEvent) => void;

  class AsteriskManager extends EventEmitter {
    constructor(
      port: number,
      host: string,
      username: string,
      password: string,
      events?: boolean
    );

    keepConnected(): void;
    
    action(action: AmiAction, callback?: AmiCallback): void;
    
    on(event: "connect", listener: () => void): this;
    on(event: "disconnect", listener: () => void): this;
    on(event: "error", listener: (err: Error) => void): this;
    on(event: "managerevent", listener: EventCallback): this;
    on(event: string, listener: (...args: unknown[]) => void): this;
    
    removeListener(event: string, listener: (...args: unknown[]) => void): this;
  }

  export = AsteriskManager;
}