use async_trait::async_trait;
use crate::dtos::{CompanyProfileDto, TimeSeriesFinancialDto};
use anyhow::Result;

/// 核心业务逻辑接口：数据提供者逻辑
///
/// 该 Trait 剥离了所有基础设施关注点（NATS、DB、Cache），
/// 只关注如何从特定来源获取数据。
#[async_trait]
pub trait DataProviderLogic: Send + Sync {
    /// Provider 的唯一标识符 (e.g., "tushare", "yfinance")
    fn provider_id(&self) -> &str;

    /// 检查是否支持该市场 (前置检查)
    /// 默认实现为支持所有市场，特定 Provider (如 Tushare) 可覆盖此方法
    fn supports_market(&self, _market: &str) -> bool {
        true
    }

    /// 核心业务：从外部源获取原始数据并转换为标准 DTO
    /// 
    /// # Arguments
    /// * `symbol` - 股票代码
    /// 
    /// # Returns
    /// * `Ok((Profile, Financials))` - 成功获取的数据
    /// * `Err` - 获取失败原因
    async fn fetch_data(&self, symbol: &str) -> Result<(CompanyProfileDto, Vec<TimeSeriesFinancialDto>)>;
}

