from typing_extensions import Final


class GameConstants:
    BISHI_BASHI: Final[str] = 'bishi'
    DANCE_EVOLUTION: Final[str] = 'danevo'
    DDR: Final[str] = 'ddr'
    IIDX: Final[str] = 'iidx'
    JUBEAT: Final[str] = 'jubeat'
    MUSECA: Final[str] = 'museca'
    POPN_MUSIC: Final[str] = 'pnm'
    REFLEC_BEAT: Final[str] = 'reflec'
    SDVX: Final[str] = 'sdvx'


class VersionConstants:
    BISHI_BASHI_TSBB: Final[int] = 1

    DDR_1STMIX: Final[int] = 1
    DDR_2NDMIX: Final[int] = 2
    DDR_3RDMIX: Final[int] = 3
    DDR_4THMIX: Final[int] = 4
    DDR_5THMIX: Final[int] = 5
    DDR_6THMIX: Final[int] = 6
    DDR_7THMIX: Final[int] = 7
    DDR_EXTREME: Final[int] = 8
    DDR_SUPERNOVA: Final[int] = 9
    DDR_SUPERNOVA_2: Final[int] = 10
    DDR_X: Final[int] = 11
    DDR_X2: Final[int] = 12
    DDR_X3_VS_2NDMIX: Final[int] = 13
    DDR_2013: Final[int] = 14
    DDR_2014: Final[int] = 15
    DDR_ACE: Final[int] = 16
    DDR_A20: Final[int] = 17

    IIDX: Final[int] = 1
    IIDX_2ND_STYLE: Final[int] = 2
    IIDX_3RD_STYLE: Final[int] = 3
    IIDX_4TH_STYLE: Final[int] = 4
    IIDX_5TH_STYLE: Final[int] = 5
    IIDX_6TH_STYLE: Final[int] = 6
    IIDX_7TH_STYLE: Final[int] = 7
    IIDX_8TH_STYLE: Final[int] = 8
    IIDX_9TH_STYLE: Final[int] = 9
    IIDX_10TH_STYLE: Final[int] = 10
    IIDX_RED: Final[int] = 11
    IIDX_HAPPY_SKY: Final[int] = 12
    IIDX_DISTORTED: Final[int] = 13
    IIDX_GOLD: Final[int] = 14
    IIDX_DJ_TROOPERS: Final[int] = 15
    IIDX_EMPRESS: Final[int] = 16
    IIDX_SIRIUS: Final[int] = 17
    IIDX_RESORT_ANTHEM: Final[int] = 18
    IIDX_LINCLE: Final[int] = 19
    IIDX_TRICORO: Final[int] = 20
    IIDX_SPADA: Final[int] = 21
    IIDX_PENDUAL: Final[int] = 22
    IIDX_COPULA: Final[int] = 23
    IIDX_SINOBUZ: Final[int] = 24
    IIDX_CANNON_BALLERS: Final[int] = 25
    IIDX_ROOTAGE: Final[int] = 26
    IIDX_HEROIC_VERSE: Final[int] = 27
    IIDX_BISTROVER: Final[int] = 28

    JUBEAT: Final[int] = 1
    JUBEAT_RIPPLES: Final[int] = 2
    JUBEAT_RIPPLES_APPEND: Final[int] = 3
    JUBEAT_KNIT: Final[int] = 4
    JUBEAT_KNIT_APPEND: Final[int] = 5
    JUBEAT_COPIOUS: Final[int] = 6
    JUBEAT_COPIOUS_APPEND: Final[int] = 7
    JUBEAT_SAUCER: Final[int] = 8
    JUBEAT_SAUCER_FULFILL: Final[int] = 9
    JUBEAT_PROP: Final[int] = 10
    JUBEAT_QUBELL: Final[int] = 11
    JUBEAT_CLAN: Final[int] = 12
    JUBEAT_FESTO: Final[int] = 13

    MUSECA: Final[int] = 1
    MUSECA_1_PLUS: Final[int] = 2

    POPN_MUSIC: Final[int] = 1
    POPN_MUSIC_2: Final[int] = 2
    POPN_MUSIC_3: Final[int] = 3
    POPN_MUSIC_4: Final[int] = 4
    POPN_MUSIC_5: Final[int] = 5
    POPN_MUSIC_6: Final[int] = 6
    POPN_MUSIC_7: Final[int] = 7
    POPN_MUSIC_8: Final[int] = 8
    POPN_MUSIC_9: Final[int] = 9
    POPN_MUSIC_10: Final[int] = 10
    POPN_MUSIC_11: Final[int] = 11
    POPN_MUSIC_IROHA: Final[int] = 12
    POPN_MUSIC_CARNIVAL: Final[int] = 13
    POPN_MUSIC_FEVER: Final[int] = 14
    POPN_MUSIC_ADVENTURE: Final[int] = 15
    POPN_MUSIC_PARTY: Final[int] = 16
    POPN_MUSIC_THE_MOVIE: Final[int] = 17
    POPN_MUSIC_SENGOKU_RETSUDEN: Final[int] = 18
    POPN_MUSIC_TUNE_STREET: Final[int] = 19
    POPN_MUSIC_FANTASIA: Final[int] = 20
    POPN_MUSIC_SUNNY_PARK: Final[int] = 21
    POPN_MUSIC_LAPISTORIA: Final[int] = 22
    POPN_MUSIC_ECLALE: Final[int] = 23
    POPN_MUSIC_USANEKO: Final[int] = 24
    POPN_MUSIC_PEACE: Final[int] = 25

    REFLEC_BEAT: Final[int] = 1
    REFLEC_BEAT_LIMELIGHT: Final[int] = 2
    REFLEC_BEAT_COLETTE: Final[int] = 3
    REFLEC_BEAT_GROOVIN: Final[int] = 4
    REFLEC_BEAT_VOLZZA: Final[int] = 5
    REFLEC_BEAT_VOLZZA_2: Final[int] = 6
    REFLEC_BEAT_REFLESIA: Final[int] = 7

    SDVX_BOOTH: Final[int] = 1
    SDVX_INFINITE_INFECTION: Final[int] = 2
    SDVX_GRAVITY_WARS: Final[int] = 3
    SDVX_HEAVENLY_HAVEN: Final[int] = 4


class APIConstants:
    ID_TYPE_SERVER: Final[str] = 'server'
    ID_TYPE_CARD: Final[str] = 'card'
    ID_TYPE_SONG: Final[str] = 'song'
    ID_TYPE_INSTANCE: Final[str] = 'instance'


class DBConstants:
    # When adding new game series, I try to make sure that constants
    # go in order, and have a difference of 100 between them. This is
    # so I can promote lamps/scores/etc by using a simple "max", while
    # still allowing for new game versions to insert new constants anywhere
    # in the lineup. You'll notice a few areas where constants go up by
    # non-100. This is because a new game came out in this series after
    # existing scores were in production, so constants for new grades/lamps
    # had to be snuck in. The actual constant doesn't matter as long as they
    # go in order, so this works out nicely.

    # Its up to various games to map the in-game constant to these DB
    # constants. Most games will implement a pair of functions that takes
    # one of these values and spits out the game-specific constant, and
    # vice versa. This keeps us individual game agnostic and allows us to
    # react easily to renumberings and constant insertions. These constants
    # will only be found in the DB itself, as well as used on the frontend
    # to display various general information about scores.

    OMNIMIX_VERSION_BUMP: Final[int] = 10000

    DDR_HALO_NONE: Final[int] = 100
    DDR_HALO_GOOD_FULL_COMBO: Final[int] = 200
    DDR_HALO_GREAT_FULL_COMBO: Final[int] = 300
    DDR_HALO_PERFECT_FULL_COMBO: Final[int] = 400
    DDR_HALO_MARVELOUS_FULL_COMBO: Final[int] = 500
    DDR_RANK_E: Final[int] = 100
    DDR_RANK_D: Final[int] = 200
    DDR_RANK_D_PLUS: Final[int] = 233
    DDR_RANK_C_MINUS: Final[int] = 266
    DDR_RANK_C: Final[int] = 300
    DDR_RANK_C_PLUS: Final[int] = 333
    DDR_RANK_B_MINUS: Final[int] = 366
    DDR_RANK_B: Final[int] = 400
    DDR_RANK_B_PLUS: Final[int] = 433
    DDR_RANK_A_MINUS: Final[int] = 466
    DDR_RANK_A: Final[int] = 500
    DDR_RANK_A_PLUS: Final[int] = 533
    DDR_RANK_AA_MINUS: Final[int] = 566
    DDR_RANK_AA: Final[int] = 600
    DDR_RANK_AA_PLUS: Final[int] = 650
    DDR_RANK_AAA: Final[int] = 700

    IIDX_CLEAR_STATUS_NO_PLAY: Final[int] = 50
    IIDX_CLEAR_STATUS_FAILED: Final[int] = 100
    IIDX_CLEAR_STATUS_ASSIST_CLEAR: Final[int] = 200
    IIDX_CLEAR_STATUS_EASY_CLEAR: Final[int] = 300
    IIDX_CLEAR_STATUS_CLEAR: Final[int] = 400
    IIDX_CLEAR_STATUS_HARD_CLEAR: Final[int] = 500
    IIDX_CLEAR_STATUS_EX_HARD_CLEAR: Final[int] = 600
    IIDX_CLEAR_STATUS_FULL_COMBO: Final[int] = 700
    IIDX_DAN_RANK_7_KYU: Final[int] = 100
    IIDX_DAN_RANK_6_KYU: Final[int] = 200
    IIDX_DAN_RANK_5_KYU: Final[int] = 300
    IIDX_DAN_RANK_4_KYU: Final[int] = 400
    IIDX_DAN_RANK_3_KYU: Final[int] = 500
    IIDX_DAN_RANK_2_KYU: Final[int] = 600
    IIDX_DAN_RANK_1_KYU: Final[int] = 700
    IIDX_DAN_RANK_1_DAN: Final[int] = 800
    IIDX_DAN_RANK_2_DAN: Final[int] = 900
    IIDX_DAN_RANK_3_DAN: Final[int] = 1000
    IIDX_DAN_RANK_4_DAN: Final[int] = 1100
    IIDX_DAN_RANK_5_DAN: Final[int] = 1200
    IIDX_DAN_RANK_6_DAN: Final[int] = 1300
    IIDX_DAN_RANK_7_DAN: Final[int] = 1400
    IIDX_DAN_RANK_8_DAN: Final[int] = 1500
    IIDX_DAN_RANK_9_DAN: Final[int] = 1600
    IIDX_DAN_RANK_10_DAN: Final[int] = 1700
    IIDX_DAN_RANK_CHUDEN: Final[int] = 1800
    IIDX_DAN_RANK_KAIDEN: Final[int] = 1900

    JUBEAT_PLAY_MEDAL_FAILED: Final[int] = 100
    JUBEAT_PLAY_MEDAL_CLEARED: Final[int] = 200
    JUBEAT_PLAY_MEDAL_NEARLY_FULL_COMBO: Final[int] = 300
    JUBEAT_PLAY_MEDAL_FULL_COMBO: Final[int] = 400
    JUBEAT_PLAY_MEDAL_NEARLY_EXCELLENT: Final[int] = 500
    JUBEAT_PLAY_MEDAL_EXCELLENT: Final[int] = 600

    MUSECA_GRADE_DEATH: Final[int] = 100        # 没
    MUSECA_GRADE_POOR: Final[int] = 200         # 拙
    MUSECA_GRADE_MEDIOCRE: Final[int] = 300     # 凡
    MUSECA_GRADE_GOOD: Final[int] = 400         # 佳
    MUSECA_GRADE_GREAT: Final[int] = 500        # 良
    MUSECA_GRADE_EXCELLENT: Final[int] = 600    # 優
    MUSECA_GRADE_SUPERB: Final[int] = 700       # 秀
    MUSECA_GRADE_MASTERPIECE: Final[int] = 800  # 傑
    MUSECA_GRADE_PERFECT: Final[int] = 900      # 傑
    MUSECA_CLEAR_TYPE_FAILED: Final[int] = 100
    MUSECA_CLEAR_TYPE_CLEARED: Final[int] = 200
    MUSECA_CLEAR_TYPE_FULL_COMBO: Final[int] = 300

    POPN_MUSIC_PLAY_MEDAL_CIRCLE_FAILED: Final[int] = 100
    POPN_MUSIC_PLAY_MEDAL_DIAMOND_FAILED: Final[int] = 200
    POPN_MUSIC_PLAY_MEDAL_STAR_FAILED: Final[int] = 300
    POPN_MUSIC_PLAY_MEDAL_EASY_CLEAR: Final[int] = 400
    POPN_MUSIC_PLAY_MEDAL_CIRCLE_CLEARED: Final[int] = 500
    POPN_MUSIC_PLAY_MEDAL_DIAMOND_CLEARED: Final[int] = 600
    POPN_MUSIC_PLAY_MEDAL_STAR_CLEARED: Final[int] = 700
    POPN_MUSIC_PLAY_MEDAL_CIRCLE_FULL_COMBO: Final[int] = 800
    POPN_MUSIC_PLAY_MEDAL_DIAMOND_FULL_COMBO: Final[int] = 900
    POPN_MUSIC_PLAY_MEDAL_STAR_FULL_COMBO: Final[int] = 1000
    POPN_MUSIC_PLAY_MEDAL_PERFECT: Final[int] = 1100

    REFLEC_BEAT_CLEAR_TYPE_NO_PLAY: Final[int] = 100
    REFLEC_BEAT_CLEAR_TYPE_FAILED: Final[int] = 200
    REFLEC_BEAT_CLEAR_TYPE_CLEARED: Final[int] = 300
    REFLEC_BEAT_CLEAR_TYPE_HARD_CLEARED: Final[int] = 400
    REFLEC_BEAT_CLEAR_TYPE_S_HARD_CLEARED: Final[int] = 500
    REFLEC_BEAT_COMBO_TYPE_NONE: Final[int] = 100
    REFLEC_BEAT_COMBO_TYPE_ALMOST_COMBO: Final[int] = 200
    REFLEC_BEAT_COMBO_TYPE_FULL_COMBO: Final[int] = 300
    REFLEC_BEAT_COMBO_TYPE_FULL_COMBO_ALL_JUST: Final[int] = 400

    SDVX_CLEAR_TYPE_NO_PLAY: Final[int] = 50
    SDVX_CLEAR_TYPE_FAILED: Final[int] = 100
    SDVX_CLEAR_TYPE_CLEAR: Final[int] = 200
    SDVX_CLEAR_TYPE_HARD_CLEAR: Final[int] = 300
    SDVX_CLEAR_TYPE_ULTIMATE_CHAIN: Final[int] = 400
    SDVX_CLEAR_TYPE_PERFECT_ULTIMATE_CHAIN: Final[int] = 500
    SDVX_GRADE_NO_PLAY: Final[int] = 100
    SDVX_GRADE_D: Final[int] = 200
    SDVX_GRADE_C: Final[int] = 300
    SDVX_GRADE_B: Final[int] = 400
    SDVX_GRADE_A: Final[int] = 500
    SDVX_GRADE_A_PLUS: Final[int] = 550
    SDVX_GRADE_AA: Final[int] = 600
    SDVX_GRADE_AA_PLUS: Final[int] = 650
    SDVX_GRADE_AAA: Final[int] = 700
    SDVX_GRADE_AAA_PLUS: Final[int] = 800
    SDVX_GRADE_S: Final[int] = 900
