from django.db import models
from apps.base.models import BaseModel


class ProblemType(models.IntegerChoices):
    ACM = 0
    OI = 1


class ProblemAuth(models.IntegerChoices):
    PUBLIC = 0
    PRIVATE = 1
    CONTEST = 2


class Degree(models.IntegerChoices):
    EASY = 0
    BASE = 1
    MEDIUM = 2
    HARD = 3


class VideoStatus(models.IntegerChoices):
    PRIVATE = 0
    UPLOADING = 1
    PUBLIC = 2


class CourseLevel(models.IntegerChoices):
    EASY = 0
    BASE = 1
    Advanced = 2
    PRO = 3


class JudgeType(models.TextChoices):
    SPJ = "spj"
    COMMON = "common"


class ChapterIndex(models.TextChoices):
    ONE = "第一章"
    TWO = "第二章"
    THREE = "第三章"
    FOUR = "第四章"
    FIVE = "第五章"
    SIX = "第六章"
    SEVEN = "第七章"
    EIGHT = "第八章"
    NINE = "第九章"
    TEN = "第十章"
    ELEVEN = "第十一章"
    TWELVE = "第十二章"


class Course(BaseModel):
    """课程模型

    """
    title = models.CharField(max_length=50)
    description = models.TextField(null=True)
    price = models.FloatField(default=0)
    cover_img_url = models.CharField(max_length=255)
    view_count = models.IntegerField(default=0)
    sale_count = models.IntegerField(default=0)
    is_active = models.BooleanField(default=True)
    # 课程分类，默认为基础
    level = models.IntegerField(
        choices=CourseLevel.choices, default=CourseLevel.BASE)


class Chapter(BaseModel):
    """章节模型

    """
    index = models.CharField(choices=ChapterIndex.choices,max_length=50)
    title = models.CharField(max_length=100)
    description = models.TextField(null=True)
    cover_img_url = models.CharField(max_length=255, default=None)
    view_count = models.IntegerField(default=0)
    is_active = models.BooleanField(default=True)

    course_id = models.ForeignKey(
        Course, on_delete=models.CASCADE)


class Lession(BaseModel):
    """节模型
    """
    index = models.IntegerField()
    title = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)
    # 一个章节有多节课,one to many
    chapter_id = models.ForeignKey(
        Chapter, on_delete=models.CASCADE)
    # 一节课一个视频，一个视频多节课，one to many
    # 一节课有多个问题，一个问题有多节课 ,many to many


class Video(BaseModel):
    """视频模型
    """
    title = models.CharField(max_length=100)
    img_url = models.CharField(max_length=255)
    video_url = models.CharField(max_length=255)
    count = models.IntegerField(default=0)
    is_free = models.BooleanField(default=False)
    duration = models.IntegerField()  # s
    size = models.IntegerField()  # kb
    status = models.IntegerField(choices=VideoStatus.choices, default=VideoStatus.PUBLIC)
    description = models.CharField(max_length=255, null=True)
    is_active = models.BooleanField(default=True)
    lession = models.OneToOneField(
        Lession, on_delete=models.DO_NOTHING)


class Problem(BaseModel):
    """问题模型"""
    judge_type = models.CharField(choices=JudgeType.choices, max_length=10, default=JudgeType.COMMON)
    problem_id = models.CharField(max_length=20, unique=True)
    title = models.CharField(max_length=100)
    type = models.IntegerField(choices=ProblemType.choices, default=ProblemType.OI)
    time_limit = models.IntegerField(default=1000)  # 1000ms
    memory_limit = models.IntegerField(default=128)  # 128mb
    start_limit = models.IntegerField(default=128)  # 128mb
    description = models.TextField()
    input_description = models.TextField()
    output_description = models.TextField()
    examples = models.TextField()
    degree = models.IntegerField(choices=Degree.choices, default=Degree.BASE)
    hint = models.TextField(null=True)
    auth = models.IntegerField(choices=ProblemAuth.choices, default=ProblemAuth.PUBLIC)
    io_score = models.IntegerField(default=100)  # 满分100
    code_share = models.BooleanField(default=True)
    spj_code = models.TextField(null=True)
    spj_language = models.CharField(max_length=50, null=True)
    is_remove_end_blank = models.BooleanField(default=True)
    is_open_case = models.BooleanField(default=True)
    is_upload_case = models.BooleanField(default=True)
    is_active = models.BooleanField(default=True)
    lession_id = models.ForeignKey(Lession, on_delete=models.DO_NOTHING)


class Tag(BaseModel):
    """标签模型"""
    name = models.CharField(max_length=50)
    status = models.BooleanField(default=True)
    # 问题，标签 多对多
    problems = models.ManyToManyField(Problem)


class Case(BaseModel):
    input = models.TextField()
    output = models.TextField()
    status = models.BooleanField(default=True)
    problem_id = models.ForeignKey(Problem, on_delete=models.CASCADE)

    class Meta:
        db_table = "case"


class Language(BaseModel):
    content_type = models.CharField(max_length=50)
    description = models.TextField()
    name = models.CharField(max_length=50)
    compile_command = models.TextField()
    is_spj = models.BooleanField()
