from django.db import models
from django.utils import timezone #시간, 날짜와 관련된 모듈 
import random 
from django.core.exceptions import ValidationError # 
from django.utils.translation import gettext_lazy as _

# Create your models here.
class File(models.Model) : 

    course = models.CharField(max_length=30)
    csv_file = models.FileField(upload_to="randTeam/csv_file")

    create_date = models.DateTimeField(auto_now_add=True)

    def create(self) :
        self.save()

    def __str__(self) :

        return self.course    

class TimestampModel(models.Model) :

    create_date = models.DateTimeField(auto_now_add=True)
    update_date = models.DateTimeField(auto_now=True)

    class Meta : 
        abstract = True 


class Project(TimestampModel) : 
    """
    shell에 돌리면 아래처럼 결과가 뜬다. 
    \>>> p = Project.objects.get(pk=1)
    \>>> p
    <Project: project 1>
    \>>> p.create_date
    datetime.datetime(2019, 3, 14, 2, 32, 51, 480353, tzinfo=<UTC>)
    \>>> p.update_date
    datetime.datetime(2019, 3, 14, 2, 32, 51, 480353, tzinfo=<UTC>)
    """
    title = models.CharField(max_length=30, blank=True, null=True)

    def __str__(self) : 
        return self.title

class PublishedManager(models.Manager) : 
    use_for_related_fields = True 

    def published(self, **kwargs) :
        return self.filter(pub_date__lte=timezone.now(), **kwargs)

class FlavorReview(models.Model) : 
    review = models.CharField(max_length = 30) 
    pub_date = models.DateTimeField()

    #커스텀 모델 매니저 추가 
    #기존 objects라는 이름의 manager를 오버라이팅하는 것 
    objects = PublishedManager() 


def validate_lotto(value):
    if value < 5:
        raise ValidationError(
            _('%(value)s has to be equal or over 5'),
            params={'value': value},
        )

class MyLotto(models.Model):
    num_lotto = models.IntegerField(validators=[validate_lotto])


#########################################


class GuessNumbers(models.Model): #슈퍼클래스 models의 하위클래스 Model을 상속받는다.
    def validate_lotto(value):
        if value < 5:
            raise ValidationError(
                _('%(value)s has to be equal or over 5'),
                params={'value': value},
            ) # 5 미만의 숫자 입력시, 오류가 발생하는 함수 정의
            
    name = models.CharField(max_length = 24) # name이라는 이름의 필드 작성
    lottos = models.CharField(max_length = 255) # lottos는 숫자 조합을 넣는 필드, 기본값(default) 설정.
    text = models.CharField(max_length = 255) # 한줄 메모장으로 사용하기 위해 설정, 최대 글자수 255로 제한.
    num_lotto = models.IntegerField(validators=[validate_lotto]) # 앞에서 정의한 validate_lotto를 받아서 입력.
    update_date = models.DateTimeField() # 업데이트 된 날짜 입력.

    # 메소드 정의
    def generate(self):
        self.lottos = ""
        origin = list(range(1,46)) #[1, 2, 3.....44, 45]
        for _ in range(0, self.num_lotto): # self.num_lotto 수만큼 반복해서 아래를 수행한다.
            random.shuffle(origin) # origin 리스트 순서를 섞는다.
            guess = origin[:6] #index번호 0부터 5 까지를 뽑아낸다.
            guess.sort()
            self.lottos += str(guess) + '\n' # \n은 줄바꿈
            print(self.lottos)
        self.update_date = timezone.now() # 현재시간 입력
        self.save() # 오브젝트를 db에 저장

    def __str__(self):
        return '%s - %s' % (self.name, self.text)
    # __str__ 메서드를 삽입한 이유는 이 메서드가 없으면 장고의 기본이름이 입력되기 때문입니다.


class Question(models.Model) :

    game = ( # 왼쪽 : 사용자 / 오른쪽 : 작성자
        ("오버워치", "옵치" ),
        ("배틀그라운", "배그"),
        ("하스스톤", "하스스톤"),
        ("히어로즈오브스톰", "히오스"), 
    )

    title = models.CharField(max_length=100)
    writer = models.CharField(max_length=15)
    category = models.CharField(max_length=100 ,choices=game, default="하스스톤")

    content = models.TextField()

    password = models.CharField(max_length=10)
    image = models.ImageField(verbose_name="이미지") 

    created_date = models.DateTimeField(auto_now_add=True) #편집 불가능, 자동 생성 
    updated_date = models.DateTimeField(auto_now=True) #자동 생성 

    def __str__(self) : 
        return "%s - %s" %(self.title, self.writer)


    
