import { ConfigService } from '@nestjs/config';
import { IDnsProvider, DnsZoneInfo, DnsRecordInfo, CreateDnsRecordConfig, UpdateDnsRecordConfig } from '../interfaces/dns-provider.interface';
import { ICredentialProvider } from '../interfaces/credential-provider.interface';
/**
 * Hetzner DNS Service - Cloud API implementation
 *
 * Uses the Hetzner Cloud API (api.hetzner.cloud/v1) with the same Bearer token
 * as other Hetzner Cloud services. The Cloud API uses RRSets (grouped by name+type)
 * instead of individual records. This service maps between the IDnsProvider
 * individual record interface and the RRSet model.
 *
 * Record IDs are composed as "{name}/{type}:{value}" to uniquely identify
 * individual values within an RRSet.
 */
export declare class HetznerDnsService implements IDnsProvider {
    private readonly configService;
    private readonly credentialProvider;
    private readonly logger;
    private readonly basePath;
    private readonly timeout;
    constructor(configService: ConfigService, credentialProvider: ICredentialProvider);
    private createAxiosInstance;
    private createConfiguration;
    private createZonesApi;
    private createRRSetsApi;
    listZones(): Promise<DnsZoneInfo[]>;
    getZone(zoneId: string): Promise<DnsZoneInfo | null>;
    getZoneByName(name: string): Promise<DnsZoneInfo | null>;
    listRecords(zoneId: string): Promise<DnsRecordInfo[]>;
    getRecord(zoneId: string, recordId: string): Promise<DnsRecordInfo | null>;
    createRecord(config: CreateDnsRecordConfig): Promise<DnsRecordInfo>;
    updateRecord(config: UpdateDnsRecordConfig): Promise<DnsRecordInfo>;
    deleteRecord(zoneId: string, recordId: string): Promise<void>;
    bulkCreateRecords(zoneId: string, records: CreateDnsRecordConfig[]): Promise<DnsRecordInfo[]>;
    purgeARecords(zoneId: string): Promise<number>;
    testConnection(): Promise<{
        success: boolean;
        error?: string;
    }>;
    /**
     * Replace all records in an RRSet using the set-records endpoint.
     * The Cloud API uses POST /zones/{id}/rrsets/{name}/{type}/records
     * with body { records: [...] } to replace all record values.
     *
     * Since the generated client's updateZoneRrset only supports label changes,
     * we use a direct axios call for the set-records operation.
     */
    private setRRSetRecords;
    private applyLabels;
    /**
     * Remove a single value from an RRSet.
     * If it's the last value, deletes the entire RRSet.
     */
    private removeValueFromRRSet;
    /**
     * Compose a synthetic record ID from name, type, and value.
     * Format: "{name}/{type}:{value}"
     */
    private composeRecordId;
    /**
     * Parse a synthetic record ID back into its components.
     * Expected format: "{name}/{type}:{value}"
     */
    private parseRecordId;
    /**
     * Flatten an RRSet into individual DnsRecordInfo entries.
     * Each record value becomes a separate entry with a composed recordId.
     */
    private flattenRRSet;
    private mapZone;
}
