/**
 * DTO para crear un extracto bancario con sus lineas
 */
export interface CreateBankStatementLineDto {
  /** Fecha de la transaccion (YYYY-MM-DD) */
  transaction_date: string;
  /** Fecha valor opcional (YYYY-MM-DD) */
  value_date?: string;
  /** Descripcion del movimiento */
  description?: string;
  /** Referencia del movimiento (numero de cheque, transferencia, etc.) */
  reference?: string;
  /** Monto del movimiento (positivo=deposito, negativo=retiro) */
  amount: number;
  /** ID del partner si se conoce */
  partner_id?: string;
  /** Notas adicionales */
  notes?: string;
}

/**
 * DTO para crear un extracto bancario completo
 */
export interface CreateBankStatementDto {
  /** ID de la compania */
  company_id?: string;
  /** ID de la cuenta bancaria (cuenta contable tipo banco) */
  bank_account_id?: string;
  /** Fecha del extracto (YYYY-MM-DD) */
  statement_date: string;
  /** Saldo de apertura */
  opening_balance: number;
  /** Saldo de cierre */
  closing_balance: number;
  /** Lineas del extracto */
  lines: CreateBankStatementLineDto[];
}

/**
 * DTO para actualizar un extracto bancario
 */
export interface UpdateBankStatementDto {
  /** ID de la cuenta bancaria */
  bank_account_id?: string;
  /** Fecha del extracto */
  statement_date?: string;
  /** Saldo de apertura */
  opening_balance?: number;
  /** Saldo de cierre */
  closing_balance?: number;
}

/**
 * DTO para agregar lineas a un extracto existente
 */
export interface AddBankStatementLinesDto {
  /** Lineas a agregar */
  lines: CreateBankStatementLineDto[];
}

/**
 * Filtros para buscar extractos bancarios
 */
export interface BankStatementFilters {
  /** ID de la compania */
  company_id?: string;
  /** ID de la cuenta bancaria */
  bank_account_id?: string;
  /** Estado del extracto */
  status?: 'draft' | 'reconciling' | 'reconciled';
  /** Fecha desde (YYYY-MM-DD) */
  date_from?: string;
  /** Fecha hasta (YYYY-MM-DD) */
  date_to?: string;
  /** Pagina actual */
  page?: number;
  /** Limite de resultados */
  limit?: number;
}

/**
 * Respuesta con extracto y sus lineas
 */
export interface BankStatementWithLines {
  id: string;
  tenant_id: string;
  company_id: string | null;
  bank_account_id: string | null;
  bank_account_name?: string;
  statement_date: Date;
  opening_balance: number;
  closing_balance: number;
  calculated_balance?: number;
  status: 'draft' | 'reconciling' | 'reconciled';
  imported_at: Date | null;
  imported_by: string | null;
  reconciled_at: Date | null;
  reconciled_by: string | null;
  created_at: Date;
  reconciliation_progress?: number;
  lines: BankStatementLineResponse[];
}

/**
 * Respuesta de linea de extracto
 */
export interface BankStatementLineResponse {
  id: string;
  statement_id: string;
  transaction_date: Date;
  value_date: Date | null;
  description: string | null;
  reference: string | null;
  amount: number;
  is_reconciled: boolean;
  reconciled_entry_id: string | null;
  reconciled_at: Date | null;
  reconciled_by: string | null;
  partner_id: string | null;
  partner_name?: string;
  notes: string | null;
  created_at: Date;
  /** Posibles matches encontrados por auto-reconcile */
  suggested_matches?: SuggestedMatch[];
}

/**
 * Match sugerido para una linea
 */
export interface SuggestedMatch {
  /** ID de la linea de asiento */
  entry_line_id: string;
  /** ID del asiento */
  entry_id: string;
  /** Referencia del asiento */
  entry_ref: string | null;
  /** Fecha del asiento */
  entry_date: Date;
  /** Monto de la linea */
  amount: number;
  /** Tipo de match */
  match_type: 'exact_amount' | 'amount_date' | 'reference' | 'partner';
  /** Confianza del match (0-100) */
  confidence: number;
}
