/** Type-safe interfaces for the AgentForms API. */

/** Supported field types. */
export type FieldType =
  | 'text'
  | 'email'
  | 'tel'
  | 'textarea'
  | 'select'
  | 'number'
  | 'date'
  | 'hidden';

/** Permissions assignable to an API key. */
export type Permission =
  | 'read_forms'
  | 'write_forms'
  | 'read_submissions'
  | 'delete_forms';

/** Single form field definition. */
export interface FieldDefinition {
  name: string;
  label: string;
  type: FieldType;
  required?: boolean;
  options?: string[];
  placeholder?: string;
  default?: string;
}

/** Full form returned from the API. */
export interface Form {
  id: number;
  token: string;
  name: string;
  fields: FieldDefinition[];
  created_by: string;
  embed_url: string;
  submit_url: string;
  created_at?: string;
  field_count?: number;
  metadata?: Record<string, unknown>;

  /** Public URL for humans to fill out the form. */
  readonly public_url: string;

  /** Short share link for messaging. */
  readonly share_url: string;
}

/** Single submission record. */
export interface Submission {
  id: number;
  site_id: number;
  submitted_at: string;
  dynamic_data: Record<string, unknown>;
  client_ip?: string;
  user_agent?: string;
}

/** Response from forms.list(). */
export interface FormsResponse {
  forms: Form[];
  total?: number;
  limit?: number;
  offset?: number;
}

/** API key representation. */
export interface ApiKey {
  id: number;
  key_prefix: string;
  name: string;
  permissions?: Record<string, boolean>;
  created_at?: string;
  revoked: boolean;
}

/** Response from keys.list(). */
export interface KeysResponse {
  keys: ApiKey[];
}

/** Incoming webhook payload from AgentForms. */
export interface WebhookPayload {
  event: string;
  site_id: number;
  site_name: string;
  submission_id: number;
  submitted_at: string;
  fields: Record<string, string>;
  field_metadata?: Record<string, unknown>;
}

/** Response from submissions.list(). */
export interface SubmissionsResponse {
  submissions: Submission[];
  total?: number;
  limit?: number;
  offset?: number;
}