#![allow(dead_code)]
use serde::{Deserialize, Serialize};
use crate::adapters::common::encode_path_segment;
use crate::error::{FinanceError, Result};
use crate::models::filings::{ProviderFiling, ProviderFilings};
use super::build_client;
use super::models::PaginatedResponseDTO;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct FilingEntryDTO {
pub accession_number: Option<String>,
pub filing_date: Option<String>,
pub filing_type: Option<String>,
pub filing_url: Option<String>,
pub company_name: Option<String>,
pub cik: Option<String>,
pub tickers: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct FilingSectionDTO {
pub section: Option<String>,
pub content: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct RiskFactorDTO {
pub title: Option<String>,
pub text: Option<String>,
pub category: Option<String>,
pub filing_date: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct RiskCategoryDTO {
pub name: Option<String>,
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct FilingSectionsResponseDTO {
pub request_id: Option<String>,
pub status: Option<String>,
pub results: Option<Vec<FilingSectionDTO>>,
}
pub async fn sec_edgar_index(
params: &[(&str, &str)],
) -> Result<PaginatedResponseDTO<FilingEntryDTO>> {
let client = build_client()?;
client.get("/v1/reference/sec/filings", params).await
}
pub async fn fetch_filings_response(symbol: &str) -> Result<ProviderFilings> {
let paginated = sec_edgar_index(&[("ticker", symbol)]).await?;
let filings = paginated
.results
.unwrap_or_default()
.into_iter()
.map(|f| ProviderFiling {
accession_number: f.accession_number,
filing_date: f.filing_date,
filing_type: f.filing_type,
filing_url: f.filing_url,
company_name: f.company_name,
cik: f.cik,
})
.collect();
Ok(ProviderFilings {
symbol: symbol.to_string(),
filings,
})
}
pub async fn filing_10k_sections(
accession_number: &str,
params: &[(&str, &str)],
) -> Result<FilingSectionsResponseDTO> {
let client = build_client()?;
let path = format!(
"/v1/reference/sec/filings/{}/sections",
encode_path_segment(accession_number)
);
let json = client.get_raw(&path, params).await?;
serde_json::from_value(json).map_err(|e| FinanceError::ResponseStructureError {
field: "10k_sections".to_string(),
context: format!("Failed to parse 10-K sections: {e}"),
})
}
pub async fn filing_8k_text(
accession_number: &str,
params: &[(&str, &str)],
) -> Result<FilingSectionsResponseDTO> {
let client = build_client()?;
let path = format!(
"/v1/reference/sec/filings/{}/8k",
encode_path_segment(accession_number)
);
let json = client.get_raw(&path, params).await?;
serde_json::from_value(json).map_err(|e| FinanceError::ResponseStructureError {
field: "8k_text".to_string(),
context: format!("Failed to parse 8-K text: {e}"),
})
}
pub async fn risk_factors(params: &[(&str, &str)]) -> Result<PaginatedResponseDTO<RiskFactorDTO>> {
let client = build_client()?;
client.get("/v1/reference/sec/risk-factors", params).await
}
pub async fn risk_categories() -> Result<PaginatedResponseDTO<RiskCategoryDTO>> {
let client = build_client()?;
client.get("/v1/reference/sec/risk-categories", &[]).await
}