import { Eno } from './Eno';

export {
  Batch,
  Tip,
  Sid,
  Nonce,
  Value,
  Formula,
  IEno,
  ISource,
  IField,
  II18n,
  IServerT,
  IClientT,
  IQueryResponse,
  IDimResult,
  IAttrResult,
  IQueryResult,
  ResponseHeaders,
  IHeaderValue
};

type Batch = Eno[];
type Tip = string;
type Sid = string;
type Nonce = string;
type Value = string[];
type Formula = string;

interface IEno {
  tip: Tip;
  sid: Sid;
  serverT?: IServerT | null;
  clientT?: IClientT | null;
  source?: ISource;
}

interface ISource {
  deleted: boolean;
  type: Tip;
  security: Tip;
  parent?: Sid[];
  nonce: Nonce;
  field?: IField[];
}

interface IField {
  tip: Tip;
  value?: Value;
  i18n?: II18n[];
  formula?: Formula[];
}

interface II18n {
  lang: string;
  value?: Value;
}

interface IClientT {
  branch: Tip;
  sequence: number;
  createdDate: number;
  modifiedDate: number;
}

interface IServerT {
  branch: Tip;
  session: Tip;
  sequence: number;
  createdDate: number;
  modifiedDate: number;
  createdBy?: string;
  modifiedBy?: string;
  error?: Tip[];
}

// QUERY //
interface IQueryResult {
  [dimensionValue: string]: {
    [label: string]: string;
  } | IQueryResult[];
}

interface IDimResult {
  tip?: string;
  label: string;
  values: string[];
}

interface IAttrResult {
  tip?: string;
  label: string;
  formula: string;
}

interface IQueryResponse {
  attributes: IAttrResult[];
  dimensions: IDimResult[];
  results: IQueryResult[];
  execTime: number;
  responseHeaders?: IHeaderValue[];
}

interface IHeaderValue {
  [header: string]: string
}

type ResponseHeaders = string[] | IHeaderValue[];
