"""The stats models."""
from django.db import models


class _VersionStats(models.Model):
    """The base class for all-time stats of a version.

    Sub-classes should be created to gather stats about a versioned
    end-product such as a software build.

    Attributes:
        is_official_release (models.BooleanField): If this version is an
            official release. Defaults to False.
        is_beta_release (models.BooleanField): If this version is a beta
            release. Defaults to False.
        first_seen_on (models.DateField): Day this version has been seen for
            the first time as reported by devices (not by the server). Defaults
            to the current date.
        released_on (models.DateField): Day this version has been released on.
            Defaults to the current date.
        heartbeats (models.IntegerField): The total heartbeats counted for this
            version.
        prob_crashes (models.IntegerField): The total probable crash reports
            counted for this version.
        smpl (models.IntegerField): The total SMPL reports counted for this
            version.
        other (models.IntegerField): The total of other reports counted for
            this version.

    """

    is_official_release = models.BooleanField(default=False)
    is_beta_release = models.BooleanField(default=False)
    first_seen_on = models.DateField(auto_now_add=True)
    released_on = models.DateField(auto_now_add=True)
    heartbeats = models.IntegerField(default=0)
    prob_crashes = models.IntegerField(default=0)
    smpl = models.IntegerField(default=0)
    other = models.IntegerField(default=0)

    class Meta:
        abstract = True


class _DailyVersionStats(models.Model):
    """The base class for daily stats of a version.

    Sub-classes MUST define the foreign key `version` pointing back to the
    `_VersionStats` implementation they are gathering stats for.

    Attributes:
        date (models.DateField): Day considered for the stats.
        heartbeats (models.IntegerField): The total heartbeats counted for this
            version on the day `date`.
        prob_crashes (models.IntegerField): The total probable crash reports
            counted for this version on the day `date`.
        smpl (models.IntegerField): The total SMPL reports counted for this
            version on the day `date`.
        other (models.IntegerField): The total of other reports counted for
            this version on the day `date`.

    """

    date = models.DateField(auto_now_add=True)
    heartbeats = models.IntegerField(default=0)
    prob_crashes = models.IntegerField(default=0)
    smpl = models.IntegerField(default=0)
    other = models.IntegerField(default=0)

    class Meta:
        abstract = True


class Version(_VersionStats):
    """The all-time stats of a software version.

    Attributes:
        build_fingerprint (models.CharField): The software build fingerprint
            uniquely identifying this version.

    """

    build_fingerprint = models.CharField(max_length=200, unique=True)

    def __str__(self):  # noqa: D105
        return self.build_fingerprint


class VersionDaily(_DailyVersionStats):
    """The daily stats of a software version.

    Attributes:
        version (models.ForeignKey): The software version object (`Version`)
            these daily stats are about.

    """

    version = models.ForeignKey(
        Version, db_index=True, related_name='daily_stats',
        on_delete=models.CASCADE)


class RadioVersion(_VersionStats):
    """The all-time stats of a radio version.

    Attributes:
        radio_version (models.CharField): The radio version number uniquely
            identifying this version.

    """

    radio_version = models.CharField(max_length=200, unique=True)

    def __str__(self):  # noqa: D105
        return self.radio_version


class RadioVersionDaily(_DailyVersionStats):
    """The daily stats of a radio version.

    Attributes:
        version (models.ForeignKey): The radio version object (`RadioVersion`)
            these daily stats are about.

    """

    version = models.ForeignKey(
        RadioVersion, db_index=True, related_name='daily_stats',
        on_delete=models.CASCADE)
