import fastapi
from typing import Sequence
from fastapi import APIRouter, status
from src.data.model.schemas import agent as schema, CreateAgent
from src.data.repositories import agent as repo
from src.api.dependencies import get_repository

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


@router.post(
    path="",
    name="agent::create-agent-partner",
    summary="creates a new agent for both of shops",
    operation_id="newAgent",
    status_code=status.HTTP_200_OK
)
async def create_agent(
        agent: CreateAgent,
        repository: repo.AgentRepository = fastapi.Depends(get_repository(repo_type=repo.AgentRepository)),
):
    return await repository.create_agent(agent)


@router.get(
    path="/{agent_id}",
    name="agent::get-agent-partners",
    operation_id="getAgentsPartners",
    response_model=Sequence[schema.AgentPartner],
    status_code=status.HTTP_200_OK
)
async def get_agent_partners(
        agent_id: int,
        repository: repo.AgentRepository = fastapi.Depends(get_repository(repo_type=repo.AgentRepository))
) -> Sequence[schema.AgentPartner]:
    return await repository.get_agents_partner(agent_id)


@router.get(
    path="/sales-order-types/{partner_id}",
    name="agent::get-partner-sales-order-types",
    operation_id="getSalesOrderTypesByPartner",
    response_model=Sequence[schema.PartnerSalesOrderTypes],
    status_code=status.HTTP_200_OK
)
async def get_partner_sales_order_types(
        partner_id: int,
        repository: repo.AgentRepository = fastapi.Depends(get_repository(repo_type=repo.AgentRepository))
) -> Sequence[schema.PartnerSalesOrderTypes]:
    return await repository.get_sales_order_types(partner_id)


@router.get(
    path="/partner/{partner_id}",
    name="agent::get-partner-data",
    operation_id="getPartnerData",
    response_model=schema.Partner,
    status_code=status.HTTP_200_OK
)
async def get_partner_data(
        partner_id: int,
        repository: repo.AgentRepository = fastapi.Depends(get_repository(repo_type=repo.AgentRepository))
) -> schema.Partner:
    return await repository.get_partner(partner_id)


@router.get(
    path="/agent/{username}",
    name="agent::get-agent-data",
    operation_id="getAgentData",
    response_model=schema.Agent,
    status_code=status.HTTP_200_OK
)
async def get_agent_data(
        username: str,
        repository: repo.AgentRepository = fastapi.Depends(get_repository(repo_type=repo.AgentRepository))
) -> schema.Partner:
    return await repository.get_agent(username)


@router.post(
    path="/partner-email/{partner_id}",
    name="agent::set-partner-email",
    operation_id="setPartnerEmail",
    status_code=status.HTTP_200_OK
)
async def change_partner_email(
        partner_id: int,
        email: str,
        repository: repo.AgentRepository = fastapi.Depends(get_repository(repo_type=repo.AgentRepository))
) -> dict[str, bool]:
    await repository.change_partner_email(partner_id, email)
    return {
        "success" : True
    }