import { GraphQLClient } from 'graphql-request';
import * as Dom from 'graphql-request/dist/types.dom';
import gql from 'graphql-tag';
export type Maybe<T> = T | null;
export type InputMaybe<T> = Maybe<T>;
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };
/** All built-in and custom scalars, mapped to their actual values */
export type Scalars = {
  ID: string;
  String: string;
  Boolean: boolean;
  Int: number;
  Float: number;
  Map: any;
};

export type Consumption = {
  budget?: Maybe<Scalars['Int']>;
  overageEnabled: Scalars['Boolean'];
  used: Scalars['Int'];
};

export type Feature = {
  consumption?: Maybe<Consumption>;
  id: Scalars['String'];
  metadata?: Maybe<Scalars['Map']>;
  name: Scalars['String'];
  type: FeatureType;
  unitLabel?: Maybe<Scalars['String']>;
  unitLabelPlural?: Maybe<Scalars['String']>;
};

export enum FeatureType {
  Binary = 'BINARY',
  Consumable = 'CONSUMABLE'
}

export type Group = {
  email?: Maybe<Scalars['String']>;
  id: Scalars['String'];
  metadata?: Maybe<Scalars['Map']>;
  name?: Maybe<Scalars['String']>;
  subscriptions: Array<PackageSubscription>;
};

export type Package = {
  features: Array<Feature>;
  id: Scalars['String'];
  isAddon: Scalars['Boolean'];
  metadata?: Maybe<Scalars['Map']>;
  name: Scalars['String'];
};

export type PackageSubscription = {
  package: Package;
  status: SubscriptionStatus;
};

export type Query = {
  currentGroup: Group;
};

export enum SubscriptionStatus {
  Active = 'ACTIVE',
  Cancelled = 'CANCELLED',
  Incomplete = 'INCOMPLETE',
  IncompleteExpired = 'INCOMPLETE_EXPIRED',
  PastDue = 'PAST_DUE',
  Trialing = 'TRIALING',
  Unpaid = 'UNPAID'
}

export type CurrentGroupQueryVariables = Exact<{ [key: string]: never; }>;


export type CurrentGroupQuery = { currentGroup: { id: string, name?: string | null, email?: string | null, metadata?: any | null, subscriptions: Array<{ status: SubscriptionStatus, package: { id: string, name: string, isAddon: boolean, metadata?: any | null, features: Array<{ id: string, name: string, type: FeatureType, metadata?: any | null, unitLabel?: string | null, unitLabelPlural?: string | null, consumption?: { used: number, budget?: number | null, overageEnabled: boolean } | null }> } }> } };


export const CurrentGroupDocument = gql`
    query CurrentGroup {
  currentGroup {
    id
    name
    email
    metadata
    subscriptions {
      status
      package {
        id
        name
        isAddon
        metadata
        features {
          id
          name
          type
          metadata
          unitLabel
          unitLabelPlural
          consumption {
            used
            budget
            overageEnabled
          }
        }
      }
    }
  }
}
    `;

export type SdkFunctionWrapper = <T>(action: (requestHeaders?:Record<string, string>) => Promise<T>, operationName: string, operationType?: string) => Promise<T>;


const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action();

export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) {
  return {
    CurrentGroup(variables?: CurrentGroupQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<CurrentGroupQuery> {
      return withWrapper((wrappedRequestHeaders) => client.request<CurrentGroupQuery>(CurrentGroupDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'CurrentGroup', 'query');
    }
  };
}
export type Sdk = ReturnType<typeof getSdk>;