use serde_json::json;
use tail_fin_common::BrowserSession;
use tail_fin_common::page::{ensure_on_domain, page_fetch};
use tail_fin_common::TailFinError;
use crate::auth::{build_headers, extract_ct0};
use crate::graphql::{build_graphql_url, default_features, resolve_query_id};
use crate::parsing::parse_timeline_response;
use crate::types::{TimelineResponse, TimelineType};
pub async fn fetch_timeline(
session: &BrowserSession,
timeline_type: TimelineType,
cursor: Option<&str>,
count: usize,
) -> Result<TimelineResponse, TailFinError> {
ensure_on_domain(session, &["x.com", "twitter.com"]).await?;
let ct0 = extract_ct0(session).await?;
let headers = build_headers(&ct0);
let endpoint = timeline_type.endpoint();
let query_id = resolve_query_id(session, endpoint, timeline_type.fallback_query_id()).await?;
let mut variables = json!({
"count": count,
"includePromotedContent": true,
"latestControlAvailable": true,
"requestContext": "launch",
});
if let Some(c) = cursor {
variables["cursor"] = json!(c);
}
let features = default_features();
let url = build_graphql_url(&query_id, endpoint, &variables, &features);
let method = timeline_type.method();
let data = page_fetch(session, &url, method, &headers).await?;
parse_timeline_response(&data)
}