/**
 * Finkok Response Interfaces
 * Interfaces para respuestas del PAC Finkok
 */

/**
 * Respuesta base de Finkok
 */
export interface FinkokBaseResponse {
  /** Código de resultado */
  CodEstatus?: string;
  /** Mensaje de resultado */
  Mensaje?: string;
  /** Errores si los hay */
  Incidencias?: FinkokIncidencia[];
}

/**
 * Incidencia/Error de Finkok
 */
export interface FinkokIncidencia {
  /** Código del error */
  CodigoError: string;
  /** Mensaje de error */
  MensajeIncidencia: string;
  /** Información adicional */
  ExtraInfo?: string;
  /** Nodo donde ocurrió el error */
  NodoNoOk?: string;
}

/**
 * Respuesta de timbrado (stamp)
 */
export interface FinkokStampResponse extends FinkokBaseResponse {
  /** UUID del CFDI timbrado */
  UUID?: string;
  /** Fecha de timbrado */
  Fecha?: string;
  /** Sello del SAT */
  SatSeal?: string;
  /** Número de certificado del SAT */
  NoCertificadoSAT?: string;
  /** XML timbrado completo */
  xml?: string;
  /** Cadena original del timbre */
  CadenaOriginal?: string;
  /** QR code en base64 */
  QrCode?: string;
}

/**
 * Respuesta de cancelación
 */
export interface FinkokCancelResponse extends FinkokBaseResponse {
  /** Acuse de cancelación */
  Acuse?: string;
  /** Fecha de cancelación */
  Fecha?: string;
  /** Estado de la cancelación */
  EstatusCancelacion?: string;
  /** UUID cancelado */
  UUID?: string;
  /** RFC del emisor */
  RfcEmisor?: string;
  /** Folios procesados */
  Folios?: FinkokFolioCancelacion[];
}

/**
 * Información de folio en cancelación
 */
export interface FinkokFolioCancelacion {
  /** UUID del folio */
  UUID: string;
  /** Estatus del folio */
  EstatusUUID: string;
  /** RFC del emisor */
  RfcEmisor?: string;
}

/**
 * Respuesta de consulta de estado
 */
export interface FinkokStatusResponse extends FinkokBaseResponse {
  /** Estado del CFDI */
  Estado?: string;
  /** Es cancelable */
  EsCancelable?: string;
  /** Estado de cancelación */
  EstatusCancelacion?: string;
  /** Validación EFOS */
  ValidacionEFOS?: string;
}

/**
 * Respuesta de consulta de créditos/timbres
 */
export interface FinkokCreditsResponse {
  /** Créditos disponibles */
  credit?: number;
  /** Fecha de consulta */
  date?: string;
}

/**
 * Respuesta de aceptación/rechazo de cancelación
 */
export interface FinkokCancelAnswerResponse extends FinkokBaseResponse {
  /** UUID del CFDI */
  UUID?: string;
  /** RFC del receptor */
  RfcReceptor?: string;
  /** Respuesta (Aceptacion/Rechazo) */
  Respuesta?: 'Aceptacion' | 'Rechazo';
  /** Acuse de la respuesta */
  Acuse?: string;
}

/**
 * Solicitud de cancelación pendiente
 */
export interface FinkokPendingCancellation {
  /** UUID del CFDI */
  UUID: string;
  /** RFC del emisor */
  RfcEmisor: string;
  /** RFC del receptor */
  RfcReceptor: string;
  /** Fecha de solicitud */
  Fecha: string;
  /** Total del CFDI */
  Total: number;
}

/**
 * Respuesta de lista de cancelaciones pendientes
 */
export interface FinkokPendingListResponse extends FinkokBaseResponse {
  /** Lista de cancelaciones pendientes */
  Cancelaciones?: FinkokPendingCancellation[];
}

/**
 * Configuración del cliente Finkok
 */
export interface FinkokClientConfig {
  /** Usuario de Finkok */
  username: string;
  /** Contraseña de Finkok */
  password: string;
  /** Usar ambiente de producción */
  production: boolean;
  /** Timeout en milisegundos */
  timeout?: number;
  /** URL del servicio (override) */
  serviceUrl?: string;
}

/**
 * Datos del emisor para timbrado
 */
export interface FinkokEmisorData {
  /** RFC del emisor */
  rfc: string;
  /** Nombre/Razón social */
  nombre: string;
  /** Código de régimen fiscal */
  regimenFiscal: string;
  /** Código postal del domicilio fiscal */
  domicilioFiscal?: string;
}

/**
 * Datos del receptor para timbrado
 */
export interface FinkokReceptorData {
  /** RFC del receptor */
  rfc: string;
  /** Nombre/Razón social */
  nombre: string;
  /** Código de uso CFDI */
  usoCfdi: string;
  /** Código de régimen fiscal del receptor */
  regimenFiscalReceptor?: string;
  /** Código postal del domicilio fiscal */
  domicilioFiscalReceptor?: string;
}
