/**
 * DTO para conciliar una linea de extracto con una linea de asiento
 */
export interface ReconcileLineDto {
  /** ID de la linea de asiento contable a conciliar */
  entry_line_id: string;
}

/**
 * DTO para conciliar multiples lineas en batch
 */
export interface BatchReconcileDto {
  /** Array de pares linea-extracto con linea-asiento */
  reconciliations: {
    /** ID de la linea de extracto */
    statement_line_id: string;
    /** ID de la linea de asiento */
    entry_line_id: string;
  }[];
}

/**
 * DTO para crear un asiento y conciliar automaticamente
 * Util cuando no existe asiento previo
 */
export interface CreateAndReconcileDto {
  /** ID de la cuenta contable destino */
  account_id: string;
  /** ID del diario a usar */
  journal_id: string;
  /** ID del partner (opcional) */
  partner_id?: string;
  /** Referencia para el asiento */
  ref?: string;
  /** Notas adicionales */
  notes?: string;
}

/**
 * Resultado de operacion de conciliacion
 */
export interface ReconcileResult {
  /** Exito de la operacion */
  success: boolean;
  /** ID de la linea de extracto */
  statement_line_id: string;
  /** ID de la linea de asiento conciliada */
  entry_line_id: string | null;
  /** Mensaje de error si fallo */
  error?: string;
}

/**
 * Resultado de auto-reconciliacion
 */
export interface AutoReconcileResult {
  /** Total de lineas procesadas */
  total_lines: number;
  /** Lineas conciliadas automaticamente */
  reconciled_count: number;
  /** Lineas que no pudieron conciliarse */
  unreconciled_count: number;
  /** Detalle de conciliaciones realizadas */
  reconciled_lines: {
    statement_line_id: string;
    entry_line_id: string;
    match_type: string;
    confidence: number;
  }[];
  /** Lineas con sugerencias pero sin match automatico */
  lines_with_suggestions: {
    statement_line_id: string;
    suggestions: number;
  }[];
}

/**
 * DTO para buscar lineas de asiento candidatas a conciliar
 */
export interface FindMatchCandidatesDto {
  /** Monto a buscar */
  amount: number;
  /** Fecha aproximada */
  date?: string;
  /** Referencia a buscar */
  reference?: string;
  /** ID del partner */
  partner_id?: string;
  /** Tolerancia de monto (porcentaje, ej: 0.01 = 1%) */
  amount_tolerance?: number;
  /** Tolerancia de dias */
  date_tolerance_days?: number;
  /** Limite de resultados */
  limit?: number;
}

/**
 * Respuesta de busqueda de candidatos
 */
export interface MatchCandidate {
  /** ID de la linea de asiento */
  id: string;
  /** ID del asiento */
  entry_id: string;
  /** Nombre/numero del asiento */
  entry_name: string;
  /** Referencia del asiento */
  entry_ref: string | null;
  /** Fecha del asiento */
  entry_date: Date;
  /** ID de la cuenta */
  account_id: string;
  /** Codigo de la cuenta */
  account_code: string;
  /** Nombre de la cuenta */
  account_name: string;
  /** Monto al debe */
  debit: number;
  /** Monto al haber */
  credit: number;
  /** Monto neto (debit - credit) */
  net_amount: number;
  /** Descripcion de la linea */
  description: string | null;
  /** ID del partner */
  partner_id: string | null;
  /** Nombre del partner */
  partner_name: string | null;
  /** Tipo de match */
  match_type: 'exact_amount' | 'amount_date' | 'reference' | 'partner' | 'rule';
  /** Confianza del match */
  confidence: number;
}

/**
 * DTO para crear/actualizar regla de conciliacion
 */
export interface CreateReconciliationRuleDto {
  /** Nombre de la regla */
  name: string;
  /** ID de la compania (opcional) */
  company_id?: string;
  /** Tipo de match */
  match_type: 'exact_amount' | 'reference_contains' | 'partner_name';
  /** Valor a matchear */
  match_value: string;
  /** Cuenta destino para auto-crear asiento */
  auto_account_id?: string;
  /** Prioridad (mayor = primero) */
  priority?: number;
  /** Activa o no */
  is_active?: boolean;
}

/**
 * DTO para actualizar regla de conciliacion
 */
export interface UpdateReconciliationRuleDto {
  /** Nombre de la regla */
  name?: string;
  /** Tipo de match */
  match_type?: 'exact_amount' | 'reference_contains' | 'partner_name';
  /** Valor a matchear */
  match_value?: string;
  /** Cuenta destino */
  auto_account_id?: string | null;
  /** Prioridad */
  priority?: number;
  /** Activa o no */
  is_active?: boolean;
}
