from datetime import datetime
from typing import Annotated, Literal

from annotated_types import Ge, Le, Len

PageCursor = Annotated[str, Len(64, 64)]

WorldName = Literal[
    "스카니아",
    "베라",
    "루나",
    "제니스",
    "크로아",
    "유니온",
    "엘리시움",
    "이노시스",
    "레드",
    "오로라",
    "아케인",
    "노바",
    "리부트",
    "리부트2",
    "버닝",
    "버닝2",
    "버닝3",
]

CharacterGender = Literal["남", "여"]
ItemGender = CharacterGender | None
AndroidGender = CharacterGender | None
CharacterClass = Literal[
    # 모험가
    "초보자",
    "히어로",
    "팔라딘",
    "다크나이트",
    "아크메이지(불,독)",
    "아크메이지(썬,콜)",
    "비숍",
    "보우마스터",
    "신궁",
    "패스파인더",
    "나이트로드",
    "섀도어",
    "듀얼블레이드",
    "바이퍼",
    "캡틴",
    "캐논슈터",
    # 시그너스 기사단
    "노블레스",
    "소울마스터",
    "플레임위자드",
    "윈드브레이커",
    "나이트워커",
    "스트라이커",
    "미하일",
    # 레지스탕스&데몬
    "시티즌",
    "블래스터",
    "배틀메이지",
    "와일드헌터",
    "메카닉",
    "데몬슬레이어",
    "제논",
    "데몬어벤져",
    # 영웅
    "아란",
    "에반",
    "메르세데스",
    "팬텀",
    "은월",
    "루미너스",
    # 노바
    "카이저",
    "카인",
    "카데나",
    "엔젤릭버스터",
    # 레프
    "아델",
    "일리움",
    "칼리",
    "아크",
    # 아니마
    "라라",
    "호영",
    # 초월자
    "제로",
    # 프렌즈 월드
    "키네시스",
    # 기간 한정
    "핑크빈",
    "예티",
]
# FIXME: RankingCharacterClass 가능한 값들 확인하기
RankingCharacterClass = Literal[
    "궁수",
    "기사단",
    "도적",
    "라라",
    "레지스탕스",
    "루미너스",
    "마법사",
    "메르세데스",
    "아델",
    "아란",
    "아크",
    "에반",
    "엔젤릭버스터",
    "은월",
    "일리움",
    "전사",
    "초월자",
    "카데나",
    "카이저",
    "카인",
    "칼리",
    "팬텀",
    "프렌즈 월드",
    "해적",
    "호영",
]
# FIXME: RankingCharacterSubClass 가능한 값들 확인하기
RankingCharacterSubClass = Literal[
    "",
    "나이트로드",
    "나이트워커",
    "다크나이트",
    "데몬슬레이어",
    "듀얼블레이더",
    "메카닉",
    "미하일",
    "바이퍼",
    "배틀메이지",
    "보우마스터",
    "블래스터",
    "비숍",
    "섀도어",
    "소울마스터",
    "스트라이커",
    "신궁",
    "아크메이지(불,독)",
    "아크메이지(썬,콜)",
    "와일드헌터",
    "윈드브레이커",
    "제논",
    "제로",
    "캐논마스터",
    "캡틴",
    "키네시스",
    "팔라딘",
    "패스파인더",
    "플레임위자드",
    "히어로",
]
JobClass = Literal[
    "초보자-전체 전직",
    "전사-전체 전직",
    "전사-검사",
    "전사-파이터",
    "전사-페이지",
    "전사-스피어맨",
    "전사-크루세이더",
    "전사-나이트",
    "전사-버서커",
    "전사-히어로",
    "전사-팔라딘",
    "전사-다크나이트",
    "마법사-전체 전직",
    "마법사-매지션",
    "마법사-위자드(불,)",
    "마법사-위자드(썬,)",
    "마법사-클레릭",
    "마법사-메이지(불,)",
    "마법사-메이지(썬,)",
    "마법사-프리스트",
    "마법사-아크메이지(불,)",
    "마법사-아크메이지(썬,)",
    "마법사-비숍",
    "궁수-전체 전직",
    "궁수-아처",
    "궁수-헌터",
    "궁수-사수",
    "궁수-레인저",
    "궁수-저격수",
    "궁수-보우마스터",
    "궁수-신궁",
    "궁수-아처(패스파인더)",
    "궁수-에인션트아처",
    "궁수-체이서",
    "궁수-패스파인더",
    "도적-전체 전직",
    "도적-로그",
    "도적-어쌔신",
    "도적-시프",
    "도적-허밋",
    "도적-시프마스터",
    "도적-나이트로드",
    "도적-섀도어",
    "도적-세미듀어러",
    "도적-듀어러",
    "도적-듀얼마스터",
    "도적-슬래셔",
    "도적-듀얼블레이더",
    "해적-전체 전직",
    "해적-해적",
    "해적-인파이터",
    "해적-건슬링거",
    "해적-캐논슈터",
    "해적-버커니어",
    "해적-발키리",
    "해적-캐논블래스터",
    "해적-바이퍼",
    "해적-캡틴",
    "해적-캐논마스터",
    "기사단-전체 전직",
    "기사단-노블레스",
    "기사단-소울마스터",
    "기사단-플레임위자드",
    "기사단-윈드브레이커",
    "기사단-나이트워커",
    "기사단-스트라이커",
    "기사단-미하일",
    "아란-전체 전직",
    "에반-전체 전직",
    "레지스탕스-전체 전직",
    "레지스탕스-시티즌",
    "레지스탕스-배틀메이지",
    "레지스탕스-와일드헌터",
    "레지스탕스-메카닉",
    "레지스탕스-데몬슬레이어",
    "레지스탕스-데몬어벤져",
    "레지스탕스-제논",
    "레지스탕스-블래스터",
    "메르세데스-전체 전직",
    "팬텀-전체 전직",
    "루미너스-전체 전직",
    "카이저-전체 전직",
    "엔젤릭버스터-전체 전직",
    "초월자-전체 전직",
    "초월자-제로",
    "은월-전체 전직",
    "프렌즈 월드-전체 전직",
    "프렌즈 월드-키네시스",
    "카데나-전체 전직",
    "일리움-전체 전직",
    "아크-전체 전직",
    "호영-전체 전직",
    "아델-전체 전직",
    "카인-전체 전직",
    "라라-전체 전직",
    "칼리-전체 전직",
]
ExpireDate = datetime | None
PresetNumber = Annotated[int, Ge(1), Le(3)] | None
Grade = Literal["레전드리", "유니크", "에픽", "레어"]
PotentialGrade = Grade | None
CubePotenialGrade = Literal["레전드리", "유니크", "에픽", "레어", "노멀"]
PotentialOption = str | None
ItemOptionValue = Annotated[int, Ge(-100)]  # 혼돈의 주문서로 음수 가능
ItemSlotName = Literal[
    "귀고리",
    "기계 심장",
    "눈장식",
    "망토",
    "모자",
    "무기",
    "반지1",
    "반지2",
    "반지3",
    "반지4",
    "뱃지",
    "벨트",
    "보조무기",
    "상의",
    "신발",
    "어깨장식",
    "얼굴장식",
    "엠블렘",
    "장갑",
    "펜던트",
    "펜던트2",
    "포켓 아이템",
    "하의",
    "훈장",
]
LabelName = Literal["스페셜라벨", "레드라벨", "블랙라벨", "마스터라벨"] | None
PetSkill = Literal[
    "버프 스킬 자동 사용",
    "아이템 줍기",
    "이동반경 확대",
    "자동 줍기",
    "펫 자이언트 스킬",
    "펫 훈련 스킬",
    "HP 물약충전",
    "MP 물약충전",
]
LinkSkillLevel = Annotated[int, Ge(1), Le(10)]
GuildLevel = Annotated[int, Ge(1), Le(30)]

# CubeOptionName = Literal["최대 MP", "올스탯", "점프력", "STR"]

ArtifactCrystalOption = Literal[
    "공격력/마력 증가",
    "데미지 증가",
    "몬스터 방어율 무시 증가",
    "버프 지속시간 증가",
    "보스 몬스터 공격 시 데미지 증가",
    "아이템 드롭률 증가",
    "올스탯 증가",
    "재사용 대기시간 미적용 확률 증가",
    "최대 HP/MP 증가",
    "추가 경험치 획득 증가",
    "크리티컬 데미지 증가",
    "크리티컬 확률 증가",
]
