import { z } from "zod";

// Cloudflare DNS Record types
export const DnsRecordType = z.enum([
  "A", "AAAA", "CNAME", "MX", "TXT", "NS", "SRV", "CAA", "PTR"
]);

export const CloudflareDnsRecord = z.object({
  id: z.string(),
  zone_id: z.string(),
  zone_name: z.string(),
  name: z.string(),
  type: DnsRecordType,
  content: z.string(),
  proxied: z.boolean().optional(),
  ttl: z.number(),
  priority: z.number().optional(),
  created_on: z.string(),
  modified_on: z.string(),
  meta: z.object({
    auto_added: z.boolean().optional(),
    managed_by_apps: z.boolean().optional(),
    managed_by_argo_tunnel: z.boolean().optional(),
  }).optional(),
});

export const CloudflareApiResponse = z.object({
  success: z.boolean(),
  errors: z.array(z.object({
    code: z.number(),
    message: z.string(),
  })),
  messages: z.array(z.object({
    code: z.number(),
    message: z.string(),
  })),
  result: z.union([
    z.array(CloudflareDnsRecord),
    CloudflareDnsRecord,
    z.null(),
  ]).optional(),
  result_info: z.object({
    page: z.number(),
    per_page: z.number(),
    count: z.number(),
    total_count: z.number(),
  }).optional(),
});

export const CreateDnsRecordRequest = z.object({
  type: DnsRecordType,
  name: z.string(),
  content: z.string(),
  ttl: z.number().optional().default(1),
  priority: z.number().optional(),
  proxied: z.boolean().optional(),
});

export const UpdateDnsRecordRequest = z.object({
  type: DnsRecordType.optional(),
  name: z.string().optional(),
  content: z.string().optional(),
  ttl: z.number().optional(),
  priority: z.number().optional(),
  proxied: z.boolean().optional(),
});

export type DnsRecord = z.infer<typeof CloudflareDnsRecord>;
export type DnsRecordTypeEnum = z.infer<typeof DnsRecordType>;
export type ApiResponse = z.infer<typeof CloudflareApiResponse>;
export type CreateDnsRecord = z.infer<typeof CreateDnsRecordRequest>;
export type UpdateDnsRecord = z.infer<typeof UpdateDnsRecordRequest>;