use serde::{Deserialize, Serialize};
use crate::Provider;
use crate::error::Result;
use crate::models::corporate::news::News;
use super::super::build_client;
use super::super::models::PaginatedResponseDTO;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Publisher {
pub name: Option<String>,
pub homepage_url: Option<String>,
pub logo_url: Option<String>,
pub favicon_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct InsightDTO {
pub ticker: Option<String>,
pub sentiment: Option<String>,
pub sentiment_reasoning: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct NewsArticle {
pub id: Option<String>,
pub publisher: Option<Publisher>,
pub title: Option<String>,
pub author: Option<String>,
pub published_utc: Option<String>,
pub article_url: Option<String>,
pub image_url: Option<String>,
pub description: Option<String>,
pub keywords: Option<Vec<String>>,
pub tickers: Option<Vec<String>>,
pub amp_url: Option<String>,
pub insights: Option<Vec<InsightDTO>>,
}
pub async fn stock_news(params: &[(&str, &str)]) -> Result<PaginatedResponseDTO<NewsArticle>> {
let client = build_client()?;
client.get("/v2/reference/news", params).await
}
pub async fn fetch_news_response(symbol: &str) -> Result<Vec<News>> {
let limit = "50".to_string();
let paginated = stock_news(&[("ticker", symbol), ("limit", &limit)]).await?;
Ok(paginated
.results
.into_iter()
.flatten()
.map(|a| News {
title: a.title.unwrap_or_default(),
link: a.article_url.unwrap_or_default(),
source: a.publisher.and_then(|p| p.name).unwrap_or_default(),
img: String::new(),
time: a.published_utc.unwrap_or_default(),
provider_id: Some(Provider::Polygon),
})
.collect())
}