import {z} from 'zod' export type CreateApiApiV1RequestSmtDataArgs = {body: {esiId?: string | undefined, address?: string | undefined, meterNumber: string, currentRetailer: 'Abundance Energy' | 'AE Texas' | 'Accent Energy' | 'Ambit Energy' | 'Amigo Energy' | 'Almika Power' | 'Ammper Power' | 'APG&E' | 'Arrow Energy TX' | 'Axpo US' | 'Base Power' | 'BKV Energy' | 'Budget Power' | 'BP Energy Company' | 'BP Energy Retail Company' | 'Branch Energy' | 'Calpine Energy Solutions' | 'Champion Energy Services' | 'Chariot Energy' | 'Cirro Energy' | 'Clearview Energy' | 'CleanSky Energy' | 'Clyde Energy' | 'ConocoPhillips Company' | 'Constellation' | 'David Energy' | 'Direct Energy' | 'Discount Power' | 'Digital Power USA' | 'Eligo Energy' | 'Elevate Energy' | 'ENGIE Resources' | 'Energy Texas' | 'Fanfare Energy' | 'Flagship Power' | 'Freepoint Energy Solutions' | 'Frontier Utilities' | 'Gexa Energy' | 'Good Charlie' | 'Green Mountain Energy' | 'Gridmatic Retail Energy' | 'Grid Power Direct' | 'Heritage Power' | 'Hudson Energy Services' | 'Infuse Energy' | 'Ironhorse Power Services' | 'Just Energy' | 'Light Energy' | 'Maison Energy' | 'Market Place Energy' | 'MEMSIS 1' | 'Meter Energy' | 'Metroplex Energy' | 'MidAmerican Energy Services' | 'MI Texas Rep 4' | 'MI Texas Rep 3' | 'Mothership' | 'National Gas & Electric Texas' | 'NextVolt Texas' | 'Now Power' | 'NRG' | 'Octopus Energy' | 'OhmConnect Energy' | 'OnPoint Energy Texas' | 'Otovo' | 'Payless Power' | 'Penstar Power' | 'Peridot Power' | 'Pogo Energy' | 'Pulse Power' | 'Ranchero Power' | 'Southern Federal Power LLC' | 'Reliant Energy' | 'Rhythm Energy' | 'RPower Retail' | 'SFE Energy Texas' | 'Shell Energy Solutions' | 'SmartEnergy Holdings' | 'SmartestEnergy US' | 'Spark Energy' | 'STAT Energy' | 'Stream Energy' | 'Summer Energy' | 'Tara Energy' | 'Tesla Energy' | 'Texas Retail Energy' | 'Texpo Energy' | 'TotalEnergies Gas & Power North America' | 'Tomorrow Energy Corp' | 'Town Square Energy' | 'TriEagle Energy' | 'True Power' | 'TXU Energy' | 'Value Power' | 'Varsity Energy' | 'TESM' | 'Xoom Energy Texas' | '4Change Energy' | string, waitSeconds?: number | undefined}}; export type CreateApiApiV1RequestSmtDataOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const createApiApiV1RequestSmtDataResponse = z.object({status: z.enum(["needs_clarification", "pending", "complete", "error"]), requestId: z.string().nullable(), reused: z.boolean(), step: z.string(), checkAfterSeconds: z.number().optional(), esiId: z.string().nullable(), utility: z.string().nullable(), serviceAddress: z.string().nullable(), dataStart: z.string().nullable(), dataEnd: z.string().nullable(), readingCount: z.number(), monthlyAggregates: z.array(z.object({month: z.string(), totalImportsKwh: z.number(), totalExportsKwh: z.number(), netKwh: z.number(), peakDemandKw: z.number(), daysOfData: z.number()})), avgMonthlyImportKwh: z.number().nullable(), avgMonthlyExportKwh: z.number().nullable(), peakDemandKw: z.number().nullable(), hasSolarExports: z.boolean().nullable(), intervals: z.array(z.object({timestamp: z.string(), importKwh: z.number(), exportKwh: z.number()})).optional(), intervalsTruncated: z.boolean().optional(), exports: z.object({csv: z.string(), aurora: z.string(), opensolar: z.string(), solargraf: z.string()}).optional(), errorCode: z.string().optional(), errorMessage: z.string().optional(), candidates: z.array(z.object({esiId: z.string(), formatted: z.string(), utility: z.string().nullable()})).optional(), summary: z.string()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Request Smart Meter Texas Data * * POST /api/v1/request-smt-data */ export const createApiApiV1RequestSmtData = async (args: CreateApiApiV1RequestSmtDataArgs, options?: CreateApiApiV1RequestSmtDataOptions) => { const {baseUrl = "https://meterplan.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/request-smt-data${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(createApiApiV1RequestSmtDataResponse, await res.json()) };