import fastapi
from fastapi import APIRouter, status
from src.data.model.schemas import shopping_cart as schema
from src.data.repositories.shopping_cart import ShoppingCartRepository as Repository
from src.api.dependencies import get_repository

"""
End points of shopping cart entity 
"""
router = APIRouter(prefix="/shopping_cart", tags=["shopping_cart"])


@router.get(
    path="/{partner_id}",
    operation_id="getItemsInShoppingCart",
    name="shopping_cart::get-by-id",
    response_model=schema.ShoppingCart,
    status_code=status.HTTP_200_OK
)
async def get_shopping_cart(
        partner_id: int,
        agent_id: int | None,
        repository: Repository = fastapi.Depends(get_repository(repo_type=Repository))
) -> schema.ShoppingCart:
    if agent_id == -1:
        agent_id = None
    return await repository.get_by_partner_id(partner_id, agent_id)


@router.delete(
    "/{id}",
    name="shopping_cart::delete-by-id",
    operation_id="removeItemFromShoppingCart",
    status_code=status.HTTP_200_OK
)
async def remove_item(
        id: int,
        repository: Repository = fastapi.Depends(get_repository(repo_type=Repository))
) -> dict[str, bool]:
    result = await repository.remove(id)
    return {"removed": result}


@router.post(
    path="",
    name="shopping_cart::create",
    operation_id="addItemToShoppingCart",
    summary="add item to shopping cart",
    response_model=schema.ShoppingCartItem,
    status_code=status.HTTP_200_OK
)
async def add_item(
        item: schema.ShoppingCartItemInsert,
        repository: Repository = fastapi.Depends(get_repository(repo_type=Repository))
) -> schema.ShoppingCartItem:
    added_item = await repository.add(item)
    return added_item


@router.delete(
    path="{partner_id}",
    name="shopping-cart::clear",
    operation_id="clearShoppingCart",
    summary="",
    status_code=status.HTTP_200_OK
)
async def clear_shopping_cart(
        partner_id: int,
        repository: Repository = fastapi.Depends(get_repository(repo_type=Repository))
) -> dict[str, bool]:
    removed = await repository.clear(partner_id)
    return {"success": removed}


@router.post(
    path="check/{agent_id}/{partner_id}",
    name="shopping-cart::check",
    operation_id="checkShoppingCart",
    summary="Check the allowance of order in partner tool and returns some magic number. (legacy logic)",
    status_code=status.HTTP_200_OK
)
async def check_shopping_cart(
        partner_id: int,
        agent_id: int,
        repository: Repository = fastapi.Depends(get_repository(repo_type=Repository))
) -> dict[str, int]:
    checked = await repository.check_cart(partner_id, agent_id)
    return {
        "value": checked
    }


@router.get(
    path="count/{agent_id}/{partner_id}",
    name="shopping-cart::check",
    operation_id="countShoppingCart",
    summary="Returns number of items in shopping cart",
    status_code=status.HTTP_200_OK
)
async def check_shopping_cart(
        partner_id: int,
        agent_id: int,
        repository: Repository = fastapi.Depends(get_repository(repo_type=Repository))
) -> dict[str, int]:
    count = await repository.count_cart_items(partner_id, agent_id)
    return {
        "count": count
    }


@router.post(
    path="/change_delivery_dates/{id}",
    name="shopping-cart::change-dates",
    operation_id="changeDeliveryDate",
    summary="Changes the delivery date of items in the shopping cart. Mainly used in mobi.",
    status_code=status.HTTP_200_OK
)
async def change_delivery_date(
        id: int,
        delivery_dates: schema.ShoppingCartItemChangeDate,
        repository: Repository = fastapi.Depends(get_repository(repo_type=Repository))
) -> dict[str, bool]:
    success = await repository.change_delivery_date(id, delivery_dates)
    return {
        "success": success
    }


@router.post(
    path="/set-partner-delivery-number/{id}",
    name="shopping-cart::set-delivery-number",
    operation_id="setPartnerDeviveryNumber",
    summary="Sets partner delivery number for selected item in shopping cart. Mainly used in mobi.",
    status_code=status.HTTP_200_OK
)
async def set_partner_delivery_number(
        id: int,
        number: str,
        repository: Repository = fastapi.Depends(get_repository(repo_type=Repository))
) -> dict[str, bool]:
    success = await repository.set_partner_delivery_number(id, number)
    return {
        "success": success
    }
