type EventPayloadMapping = {};

/**
 * Extends the Main "Window" Interface
 */
interface Window {
  electron: {
    ping: () => Promise<string>;
  };
}

type UnsubscribeFunction = () => void;
type SubscribeFunction<Event extends keyof EventPayloadMapping> = (payload: EventPayloadMapping[Event]) => void;

// --- Prodress R2 Request ---

/**
 * structure of a handler based prodress r2 request schema
 */
type Pdr2_Schema = {
  handler: string;
  actions: Pdr2_ActionSchema[];
};

/**
 * structure of an action based prodress r2 request subschema
 */
type Pdr2_ActionSchema = {
  action: string;
  additionalInformation: Pdr2_RequestTupel[];
  arguments: Pdr2_RequestTupel[];
  response: Pdr2_ResponseSchema;
};

/**
 * structure of the prodressd r2 request header
 */
interface Pdr2_Header {
  port?: number;
  host?: string;
  database: string;
  handler: string;
  action: string;
}

/**
 * mapping for string alias to scalar type with pdr2 read and write methods
 */
interface Pdr2_DataTypeConversion {
  string: () => string;
  integer: () => number;
  float: () => number;
  date: () => Date | null;
  date_time: () => Date | null;
}

/**
 * structrue of a response object which is already read
 */
interface Pdr2_ResponseObject {
  [key: string]: ReturnType<Pdr2_DataTypeConversion[keyof Pdr2_DataTypeConversion]>;
}

/**
 * structure of a response tupel used inside of the response schema
 */
type Pdr2_ResponseTupel = [string, keyof Pdr2_DataTypeConversion];

/**
 * strucutre of a request tupel used inside the request body and schema
 */
type Pdr2_RequestTupel = {
  [K in keyof Pdr2_DataTypeConversion]: [K, NonNullable<ReturnType<Pdr2_DataTypeConversion[K]>>];
}[keyof Pdr2_DataTypeConversion];

/**
 * structure of a prodress r2 request object recieved by the user
 */
type Pdr2_Request = {
  header: Pdr2_Header;
  body: Pdr2_RequestBody;
  response: Pdr2_ResponseSchema;
};

/**
 * structure of a prodress r2 request body
 */
type Pdr2_RequestBody = {
  additionalInformation: Pdr2_RequestTupel[];
  arguments: Pdr2_RequestTupel[][];
};

/**
 * structure of a prodress r2 response schema
 */
type Pdr2_ResponseSchema = {
  isStatic: boolean;
  responseTupel: Pdr2_ResponseTupel[];
};
