# vim: set fileencoding=utf-8
from typing import Optional

from bemani.backend.ddr.base import DDRBase
from bemani.common import VersionConstants


class DDRX(DDRBase):

    name: str = 'DanceDanceRevolution X'
    version: int = VersionConstants.DDR_X

    def previous_version(self) -> Optional[DDRBase]:
        return DDRSuperNova2(self.data, self.config, self.model)


class DDRSuperNova2(DDRBase):

    name: str = 'DanceDanceRevolution SuperNova 2'
    version: int = VersionConstants.DDR_SUPERNOVA_2

    def previous_version(self) -> Optional[DDRBase]:
        return DDRSuperNova(self.data, self.config, self.model)


class DDRSuperNova(DDRBase):

    name: str = 'DanceDanceRevolution SuperNova'
    version: int = VersionConstants.DDR_SUPERNOVA

    def previous_version(self) -> Optional[DDRBase]:
        return DDRExtreme(self.data, self.config, self.model)


class DDRExtreme(DDRBase):

    name: str = 'DanceDanceRevolution Extreme'
    version: int = VersionConstants.DDR_EXTREME

    def previous_version(self) -> Optional[DDRBase]:
        return DDR7thMix(self.data, self.config, self.model)


class DDR7thMix(DDRBase):

    name: str = 'DanceDanceRevolution 7thMix'
    version: int = VersionConstants.DDR_7THMIX

    def previous_version(self) -> Optional[DDRBase]:
        return DDR6thMix(self.data, self.config, self.model)


class DDR6thMix(DDRBase):

    name: str = 'DanceDanceRevolution 6thMix'
    version: int = VersionConstants.DDR_6THMIX

    def previous_version(self) -> Optional[DDRBase]:
        return DDR5thMix(self.data, self.config, self.model)


class DDR5thMix(DDRBase):

    name: str = 'DanceDanceRevolution 5thMix'
    version: int = VersionConstants.DDR_5THMIX

    def previous_version(self) -> Optional[DDRBase]:
        return DDR4thMix(self.data, self.config, self.model)


class DDR4thMix(DDRBase):

    name: str = 'DanceDanceRevolution 4thMix'
    version: int = VersionConstants.DDR_4THMIX

    def previous_version(self) -> Optional[DDRBase]:
        return DDR3rdMix(self.data, self.config, self.model)


class DDR3rdMix(DDRBase):

    name: str = 'DanceDanceRevolution 3rdMix'
    version: int = VersionConstants.DDR_3RDMIX

    def previous_version(self) -> Optional[DDRBase]:
        return DDR2ndMix(self.data, self.config, self.model)


class DDR2ndMix(DDRBase):

    name: str = 'DanceDanceRevolution 2ndMix'
    version: int = VersionConstants.DDR_2NDMIX

    def previous_version(self) -> Optional[DDRBase]:
        return DDR1stMix(self.data, self.config, self.model)


class DDR1stMix(DDRBase):

    name: str = 'DanceDanceRevolution 1stMix'
    version: int = VersionConstants.DDR_1STMIX
