import io

import fastapi
from django.http import FileResponse
from fastapi import APIRouter, status
from starlette.responses import StreamingResponse

from src.data.model.schemas import article as schema
from src.data.repositories.article import ArticleRepository as Repository
from src.api.dependencies import get_repository
from src.api.utils import parse_shop

router = APIRouter(prefix="/articles", tags=["articles"])


@router.get(
    path="get-article-color-sizes",
    name="articles::get-article-color-sizes",
    operation_id="getArticleColorSizes",
    summary="Get article with colors, sizes and prices",
    response_model=schema.ArticleColorSize,
    status_code=status.HTTP_200_OK
)
async def get_article_color_sizes(
        query: schema.GetArticleColorSize,
        repository: Repository = fastapi.Depends(get_repository(Repository))
) -> schema.ArticleColorSize:
    return await repository.get_article_color_size(query)


@router.get(
    path="/get-articles/{shop}",
    name="articles::get-articles",
    operation_id="getArticles",
    summary="The list of available articles for selected shop",
    response_model=list[schema.Article],
    status_code=status.HTTP_200_OK
)
async def get_articles(
        shop: str,
        color: str | None = None,
        size: str | None = None,
        theme: int | None = None,
        repository: Repository = fastapi.Depends(get_repository(Repository))
) -> list[schema.Article]:
    return await repository.get_articles(
        parse_shop(shop),
        color,
        size,
        int(theme) if theme else None
    )


@router.get(
    path="/colors/{shop}",
    name="articles::get-colors",
    operation_id="getColors",
    summary="The list of colors of available articles for selected shop. Primarily used for filter.",
    response_model=list[schema.Color],
    status_code=status.HTTP_200_OK
)
async def get_colors(
        shop: str,
        repository: Repository = fastapi.Depends(get_repository(Repository))
) -> list[schema.Color]:
    return await repository.get_colors(parse_shop(shop))


@router.get(
    path="/sizes/{shop}",
    name="articles::get-sizes",
    operation_id="getSizes",
    summary="The list of sizes of available articles for selected shop. Primarily used for filter",
    response_model=list[schema.Size],
    status_code=status.HTTP_200_OK
)
async def get_sizes(
        shop: str,
        repository: Repository = fastapi.Depends(get_repository(Repository))
) -> list[schema.Size]:
    return await repository.get_sizes(parse_shop(shop))


@router.get(
    path="/b2b/articles/csv",
    name="articles:get-articles-csv",
    operation_id="getArticlesInCsv",
    summary="The list of b2b shop articles as csv",
    status_code=status.HTTP_200_OK
)
async def get_articles_csv(repository: Repository = fastapi.Depends(get_repository(Repository))):
    buffer = await repository.get_articles_csv_export()
    return StreamingResponse(
        buffer,
        headers={
            "Content-Disposition": f"attachment; filename=articles_b2b.csv"
        },
        media_type='text/csv'
    )
