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

from bemani.backend.iidx.base import IIDXBase
from bemani.common import VersionConstants


class IIDX1stStyle(IIDXBase):

    name: str = 'Beatmania IIDX 1st style & substream'
    version: int = VersionConstants.IIDX


class IIDX2ndStyle(IIDXBase):

    name: str = 'Beatmania IIDX 2nd style'
    version: int = VersionConstants.IIDX_2ND_STYLE

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


class IIDX3rdStyle(IIDXBase):

    name: str = 'Beatmania IIDX 3rd style'
    version: int = VersionConstants.IIDX_3RD_STYLE

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


class IIDX4thStyle(IIDXBase):

    name: str = 'Beatmania IIDX 4th style'
    version: int = VersionConstants.IIDX_4TH_STYLE

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


class IIDX5thStyle(IIDXBase):

    name: str = 'Beatmania IIDX 5th style'
    version: int = VersionConstants.IIDX_5TH_STYLE

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


class IIDX6thStyle(IIDXBase):

    name: str = 'Beatmania IIDX 6th style'
    version: int = VersionConstants.IIDX_6TH_STYLE

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


class IIDX7thStyle(IIDXBase):

    name: str = 'Beatmania IIDX 7th style'
    version: int = VersionConstants.IIDX_7TH_STYLE

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


class IIDX8thStyle(IIDXBase):

    name: str = 'Beatmania IIDX 8th style'
    version: int = VersionConstants.IIDX_8TH_STYLE

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


class IIDX9thStyle(IIDXBase):

    name: str = 'Beatmania IIDX 9th style'
    version: int = VersionConstants.IIDX_9TH_STYLE

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


class IIDX10thStyle(IIDXBase):

    name: str = 'Beatmania IIDX 10th style'
    version: int = VersionConstants.IIDX_10TH_STYLE

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


class IIDXRed(IIDXBase):

    name: str = 'Beatmania IIDX RED'
    version: int = VersionConstants.IIDX_RED

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


class IIDXHappySky(IIDXBase):

    name: str = 'Beatmania IIDX HAPPY SKY'
    version: int = VersionConstants.IIDX_HAPPY_SKY

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


class IIDXDistorted(IIDXBase):

    name: str = 'Beatmania IIDX DistorteD'
    version: int = VersionConstants.IIDX_DISTORTED

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


class IIDXGold(IIDXBase):

    name: str = 'Beatmania IIDX GOLD'
    version: int = VersionConstants.IIDX_GOLD

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


class IIDXDJTroopers(IIDXBase):

    name: str = 'Beatmania IIDX DJ TROOPERS'
    version: int = VersionConstants.IIDX_DJ_TROOPERS

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


class IIDXEmpress(IIDXBase):

    name: str = 'Beatmania IIDX EMPRESS'
    version: int = VersionConstants.IIDX_EMPRESS

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


class IIDXSirius(IIDXBase):

    name: str = 'Beatmania IIDX SIRIUS'
    version: int = VersionConstants.IIDX_SIRIUS

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


class IIDXResortAnthem(IIDXBase):

    name: str = 'Beatmania IIDX Resort Anthem'
    version: int = VersionConstants.IIDX_RESORT_ANTHEM

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


class IIDXLincle(IIDXBase):

    name: str = 'Beatmania IIDX Lincle'
    version: int = VersionConstants.IIDX_LINCLE

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