# SPDX-FileCopyrightText: 2023 Marlon W (Mawoka)
#
# SPDX-License-Identifier: MPL-2.0


import gzip

from fastapi import APIRouter, Response, HTTPException, Depends
import py_avataaars_no_png as av
from fastapi.responses import PlainTextResponse
from classquiz.config import redis

from classquiz.auth import get_current_user
from classquiz.db.models import User

router = APIRouter()


class AvatarItemsAsList:
    skin_color = list(av.SkinColor)
    hair_color = list(av.HairColor)
    facial_hair_type = list(av.FacialHairType)
    facial_hair_color = list(av.HairColor)
    top_type = list(av.TopType)
    hat_color = list(av.Color)
    mouth_type = list(av.MouthType)
    eyebrow_type = list(av.EyebrowType)
    nose_type = list(av.NoseType)
    accessories_type = list(av.AccessoriesType)
    clothe_type = list(av.ClotheType)
    clothe_color = list(av.Color)
    clothe_graphic_type = list(av.ClotheGraphicType)


@router.get("/custom", response_class=PlainTextResponse)
async def get_customized_avatar(
    resp: Response,
    skin_color: int | None = 0,
    hair_color: int | None = 0,
    facial_hair_type: int | None = 0,
    facial_hair_color: int | None = 0,
    top_type: int | None = 0,
    hat_color: int | None = 0,
    mouth_type: int | None = 0,
    eyebrow_type: int | None = 0,
    nose_type: int | None = 0,
    accessories_type: int | None = 0,
    clothe_type: int | None = 0,
    clothe_color: int | None = 0,
    clothe_graphic_type: int | None = 0,
):
    try:
        skin_color = AvatarItemsAsList.skin_color[skin_color]
        hair_color = AvatarItemsAsList.hat_color[hair_color]
        facial_hair_type = AvatarItemsAsList.facial_hair_type[facial_hair_type]
        facial_hair_color = AvatarItemsAsList.facial_hair_color[facial_hair_color]
        top_type = AvatarItemsAsList.top_type[top_type]
        hat_color = AvatarItemsAsList.hat_color[hat_color]
        mouth_type = AvatarItemsAsList.mouth_type[mouth_type]
        eyebrow_type = AvatarItemsAsList.eyebrow_type[eyebrow_type]
        nose_type = AvatarItemsAsList.nose_type[nose_type]
        accessories_type = AvatarItemsAsList.accessories_type[accessories_type]
        clothe_type = AvatarItemsAsList.clothe_type[clothe_type]
        clothe_color = AvatarItemsAsList.clothe_color[clothe_color]
        clothe_graphic_type = AvatarItemsAsList.clothe_graphic_type[clothe_graphic_type]
    except IndexError:
        raise HTTPException(status_code=400, detail="One parameter-value doesn't exist.")
    resp.headers.append("Content-Type", "image/svg+xml")
    avatar = av.PyAvataaar(
        style=av.AvatarStyle.TRANSPARENT,
        skin_color=skin_color,
        hair_color=hair_color,
        facial_hair_type=facial_hair_type,
        facial_hair_color=facial_hair_color,
        top_type=top_type,
        hat_color=hat_color,
        mouth_type=mouth_type,
        eyebrow_type=eyebrow_type,
        nose_type=nose_type,
        accessories_type=accessories_type,
        clothe_type=clothe_type,
        clothe_color=clothe_color,
        clothe_graphic_type=clothe_graphic_type,
    ).render_svg()
    # skipcq: PY-W0069
    return avatar


@router.post("/save")
async def save_avatar(
    skin_color: int | None = 0,
    hair_color: int | None = 0,
    facial_hair_type: int | None = 0,
    facial_hair_color: int | None = 0,
    top_type: int | None = 0,
    hat_color: int | None = 0,
    mouth_type: int | None = 0,
    eyebrow_type: int | None = 0,
    nose_type: int | None = 0,
    accessories_type: int | None = 0,
    clothe_type: int | None = 0,
    clothe_color: int | None = 0,
    clothe_graphic_type: int | None = 0,
    user: User = Depends(get_current_user),
):
    try:
        skin_color = AvatarItemsAsList.skin_color[skin_color]
        hair_color = AvatarItemsAsList.hat_color[hair_color]
        facial_hair_type = AvatarItemsAsList.facial_hair_type[facial_hair_type]
        facial_hair_color = AvatarItemsAsList.facial_hair_color[facial_hair_color]
        top_type = AvatarItemsAsList.top_type[top_type]
        hat_color = AvatarItemsAsList.hat_color[hat_color]
        mouth_type = AvatarItemsAsList.mouth_type[mouth_type]
        eyebrow_type = AvatarItemsAsList.eyebrow_type[eyebrow_type]
        nose_type = AvatarItemsAsList.nose_type[nose_type]
        accessories_type = AvatarItemsAsList.accessories_type[accessories_type]
        clothe_type = AvatarItemsAsList.clothe_type[clothe_type]
        clothe_color = AvatarItemsAsList.clothe_color[clothe_color]
        clothe_graphic_type = AvatarItemsAsList.clothe_graphic_type[clothe_graphic_type]
    except IndexError:
        raise HTTPException(status_code=400, detail="One parameter-value doesn't exist.")
    avatar = av.PyAvataaar(
        style=av.AvatarStyle.TRANSPARENT,
        skin_color=skin_color,
        hair_color=hair_color,
        facial_hair_type=facial_hair_type,
        facial_hair_color=facial_hair_color,
        top_type=top_type,
        hat_color=hat_color,
        mouth_type=mouth_type,
        eyebrow_type=eyebrow_type,
        nose_type=nose_type,
        accessories_type=accessories_type,
        clothe_type=clothe_type,
        clothe_color=clothe_color,
        clothe_graphic_type=clothe_graphic_type,
    ).render_svg()
    user.avatar = gzip.compress(str.encode(avatar))
    await redis.delete(user.email)
    await user.update()
