import type { TDnsRecordType } from '../../../ts_interfaces/data/dns-record.js';
import type { IProviderDomainListing } from '../../../ts_interfaces/data/dns-provider.js';

/**
 * A DNS record as seen at a provider's API. The `providerRecordId` field
 * is the provider's internal identifier, used for subsequent updates and
 * deletes (since providers can have multiple records of the same name+type).
 */
export interface IProviderRecord {
  providerRecordId: string;
  name: string;
  type: TDnsRecordType;
  value: string;
  ttl: number;
  proxied?: boolean;
}

/**
 * Input shape for creating / updating a DNS record at a provider.
 */
export interface IProviderRecordInput {
  name: string;
  type: TDnsRecordType;
  value: string;
  ttl?: number;
  proxied?: boolean;
}

/**
 * Outcome of a connection test against a provider's API.
 */
export interface IConnectionTestResult {
  ok: boolean;
  error?: string;
}

/**
 * Pluggable DNS provider client interface. One implementation per provider type
 * (Cloudflare, Route53, …). Implementations live in ts/dns/providers/ and are
 * instantiated by `createDnsProvider()` in factory.ts.
 *
 * NOT a smartdata interface — this is the *runtime* client. The persisted
 * representation is in `IDnsProvider` (ts_interfaces/data/dns-provider.ts).
 */
export interface IDnsProviderClient {
  /** Lightweight check that credentials are valid and the API is reachable. */
  testConnection(): Promise<IConnectionTestResult>;

  /** List all DNS zones visible to this provider account. */
  listDomains(): Promise<IProviderDomainListing[]>;

  /** List all DNS records for a zone (FQDN). */
  listRecords(domain: string): Promise<IProviderRecord[]>;

  /** Create a new DNS record at the provider; returns the created record (with id). */
  createRecord(domain: string, record: IProviderRecordInput): Promise<IProviderRecord>;

  /** Update an existing record by provider id; returns the updated record. */
  updateRecord(
    domain: string,
    providerRecordId: string,
    record: IProviderRecordInput,
  ): Promise<IProviderRecord>;

  /** Delete a record by provider id. */
  deleteRecord(domain: string, providerRecordId: string): Promise<void>;
}
