use crate::error::{Result, YfError};
use crate::http::YfSession;
use crate::json::yf_result_first;
use serde_json::Value;
mod analysis;
mod calendar;
mod funds;
mod holders;
mod info;
mod summary;
pub use analysis::{NamedTable, RecommendationTrend, UpgradesDowngrades};
pub use calendar::{Calendar, SecFiling};
pub use funds::{FundHolding, FundsData};
pub use holders::{HolderRow, Holders};
pub use info::{FastInfo, Info};
pub use summary::{AnalystPriceTargets, Sustainability};
pub const MODULES_INFO: &[&str] = &[
"assetProfile",
"incomeStatementHistory",
"balanceSheetHistory",
"cashflowStatementHistory",
"incomeStatementHistoryQuarterly",
"balanceSheetHistoryQuarterly",
"cashflowStatementHistoryQuarterly",
"defaultKeyStatistics",
"financialData",
"calendarEvents",
"secFilings",
"recommendationTrend",
"upgradeDowngradeHistory",
"institutionOwnership",
"fundOwnership",
"majorHoldersBreakdown",
"insiderTransactions",
"insiderHolders",
"netSharePurchaseActivity",
"earnings",
"earningsHistory",
"earningsTrend",
"quoteType",
"price",
"summaryDetail",
"esgScores",
"fundProfile",
"fundOverview",
"topHoldings",
"fundPerformance",
];
pub async fn quote_summary(session: &YfSession, ticker: &str, modules: &[&str]) -> Result<Value> {
let urls = YfSession::urls();
let url = format!("{}/v10/finance/quoteSummary/{}", urls.query2, ticker);
let params = vec![("modules", modules.join(","))];
let value = session.get_json(&url, ¶ms).await?;
yf_result_first(&value, "quoteSummary")
.map_err(|_| YfError::DataMissing(format!("quoteSummary.result for {ticker}")))
.cloned()
}
pub(crate) fn ts_to_date(sec: Option<f64>) -> Option<chrono::DateTime<chrono::Utc>> {
sec.and_then(|s| chrono::DateTime::from_timestamp(s as i64, 0))
}