import app.database.controller as dbc
from app.apis import item_response, list_response, protect_route
from app.core import http_codes as codes
from app.core.dto import CodeDTO
from app.database.models import Code
from flask_restx import Resource

api = CodeDTO.api
schema = CodeDTO.schema
list_schema = CodeDTO.list_schema


@api.route("")
@api.param("competition_id")
class CodesList(Resource):
    @protect_route(allowed_roles=["*"])
    def get(self, competition_id):
        items = dbc.get.code_list(competition_id)
        return list_response(list_schema.dump(items), len(items))


@api.route("/<code_id>")
@api.param("competition_id, code_id")
class CodesById(Resource):
    @protect_route(allowed_roles=["*"])
    def put(self, competition_id, code_id):
        item = dbc.get.one(Code, code_id)
        item.code = dbc.utils.generate_unique_code()
        dbc.utils.commit_and_refresh(item)
        return item_response(schema.dump(item))