use serde::{Deserialize, Serialize};
use crate::adapters::common::encode_path_segment;
use crate::error::{FinanceError, Result};
use super::super::build_client;
use super::super::models::PaginatedResponse;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct FilingEntry {
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 FilingSection {
pub section: Option<String>,
pub content: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct RiskFactor {
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 RiskCategory {
pub name: Option<String>,
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct FilingSectionsResponse {
pub request_id: Option<String>,
pub status: Option<String>,
pub results: Option<Vec<FilingSection>>,
}
pub async fn sec_edgar_index(params: &[(&str, &str)]) -> Result<PaginatedResponse<FilingEntry>> {
let client = build_client()?;
client.get("/v1/reference/sec/filings", params).await
}
pub async fn filing_10k_sections(
accession_number: &str,
params: &[(&str, &str)],
) -> Result<FilingSectionsResponse> {
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<FilingSectionsResponse> {
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<PaginatedResponse<RiskFactor>> {
let client = build_client()?;
client.get("/v1/reference/sec/risk-factors", params).await
}
pub async fn risk_categories() -> Result<PaginatedResponse<RiskCategory>> {
let client = build_client()?;
client.get("/v1/reference/sec/risk-categories", &[]).await
}