import { TestResponse } from "@hoppscotch/js-sandbox";
import { Method } from "axios";
import { ExpectResult } from "../types/response";
import { HoppEnvs } from "../types/request";

/**
 * Defines column headers for table stream used to write table
 * data on stdout.
 * @property {string} path Path of request within collection file.
 * @property {string} endpoint Endpoint from response config.url.
 * @property {Method} method Method from response headers.
 * @property {string} statusCode Template string concating status & statusText.
 */
export interface TableResponse {
  endpoint: string;
  method: Method;
  statusCode: string;
}

/**
 * Describes additional details of HTTP response returned from
 * requestRunner.
 * @property {string} path Path of request within collection file.
 * @property {string} endpoint Endpoint from response config.url.
 * @property {Method} method Method from HTTP response headers.
 * @property {string} statusText HTTP response status text.
 */
export interface RequestRunnerResponse extends TestResponse {
  endpoint: string;
  method: Method;
  statusText: string;
  duration: number;
}

/**
 * Describes test script details.
 * @property {string} name Request name within collection.
 * @property {string} testScript Stringified hoppscotch testScript, used while
 * running testRunner.
 * @property {TestResponse} response Response structure for test script runner.
 */
export interface TestScriptParams {
  testScript: string;
  response: TestResponse;
  envs: HoppEnvs;
}

/**
 * Describe properties of test-report generated from test-runner.
 * @property {string} descriptor Test description.
 * @property {ExpectResult[]} expectResults Expected results for each
 * test-case.
 * @property {number} failed Total failed test-cases.
 * @property {number} passed Total passed test-cases;
 */
export interface TestReport {
  descriptor: string;
  expectResults: ExpectResult[];
  failed: number;
  passed: number;
}

/**
 * Describes error pair for failed HTTP requests.
 * @example { 501: "Request Not Supported" }
 */
export interface ResponseErrorPair {
  [key: number]: string;
}
