"""Tests for the ingestion service — honest reporting of empty provider fetches."""

from __future__ import annotations

from datetime import date, timedelta

import pytest

from app.models.ticker import Ticker
from app.providers.protocol import OHLCVData
from app.services import ingestion_service as svc
from tests.conftest import MockMarketDataProvider, _test_session_factory  # type: ignore


@pytest.fixture
async def session():
    async with _test_session_factory() as s:
        yield s


async def _add_ticker(session, symbol: str) -> None:
    session.add(Ticker(symbol=symbol))
    await session.commit()


def _bars(symbol: str, n: int) -> list[OHLCVData]:
    today = date.today()
    return [
        OHLCVData(ticker=symbol, date=today - timedelta(days=i),
                  open=100.0, high=101.0, low=99.0, close=100.0, volume=1000)
        for i in range(n)
    ]


async def test_empty_fetch_on_new_ticker_reports_no_data(session):
    # A non-US symbol (e.g. RHM/Rheinmetall) Alpaca doesn't cover → empty bars.
    # This must NOT report success; it surfaces as no_data.
    await _add_ticker(session, "RHM")
    result = await svc.fetch_and_ingest(session, MockMarketDataProvider(ohlcv_data=[]), "RHM")

    assert result.status == "no_data"
    assert result.records_ingested == 0
    assert "provider" in (result.message or "").lower()


async def test_happy_path_ingests_bars(session):
    await _add_ticker(session, "AAA")
    result = await svc.fetch_and_ingest(session, MockMarketDataProvider(ohlcv_data=_bars("AAA", 3)), "AAA")

    assert result.status == "complete"
    assert result.records_ingested == 3


async def test_empty_fetch_with_existing_history_is_up_to_date(session):
    # Covered ticker, just no new bars in the window → complete, not no_data.
    await _add_ticker(session, "BBB")
    await svc.fetch_and_ingest(session, MockMarketDataProvider(ohlcv_data=_bars("BBB", 2)), "BBB")

    result = await svc.fetch_and_ingest(session, MockMarketDataProvider(ohlcv_data=[]), "BBB")

    assert result.status == "complete"
    assert result.records_ingested == 0
