from django.db import models
from django.core.validators import RegexValidator, MaxValueValidator


class IPAddresses(models.Model):
    """Модель данных для хранения IP адрессов (нужно для подсчета количества просмотров)"""
    ipAddressRegex = RegexValidator(regex = r"^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$")
    ipAddress = models.CharField(validators=[ipAddressRegex], max_length=15, verbose_name="IP адрес")

    def __str__(self):
        return self.ipAddress

    class Meta:
        verbose_name = "IP адрес"
        verbose_name_plural = "IP адреса"


class Apartament(models.Model):
    """Модель данных квартиры"""
    price = models.IntegerField(validators=[MaxValueValidator(450000)], verbose_name="Стоимость аренды квартиры за месяц")
    lastPrice = models.IntegerField(validators=[MaxValueValidator(450000)], default = 0, verbose_name="Прошлая стоимость аренды квартиры за месяц")
    bail = models.IntegerField(validators=[MaxValueValidator(450000)], verbose_name="Стоимость залога квартиры")
    agencyCommission = models.IntegerField(validators=[MaxValueValidator(450000)], verbose_name="Коммисия агенству")
    utilitiesPrice = models.CharField(max_length=100, verbose_name="Стоимость коммунальных услуг")
    minimumLeasePeriod = models.IntegerField(validators=[MaxValueValidator(60)], verbose_name="Минимальный срок аренды в месяцах")

    address = models.CharField(max_length=100, verbose_name="Адрес квартиры")
    description = models.TextField(max_length=300, verbose_name="Описание квартиры")

    perimetrs = models.FloatField(validators=[MaxValueValidator(250)], verbose_name="Количество квадратных метров")
    rooms = models.IntegerField(validators=[MaxValueValidator(10)], verbose_name="Количество комнат")
    ceilingHeight = models.FloatField(validators=[MaxValueValidator(5)], verbose_name="Высота потолков в метрах")
    floor = models.IntegerField(validators=[MaxValueValidator(50)], verbose_name="Этаж квартиры")
    floorHouse = models.IntegerField(validators=[MaxValueValidator(50)], verbose_name="Количество этажей в доме")

    phoneNumberRegex = RegexValidator(regex = r"^\+?1?\d{8,15}$")
    phoneNumber = models.CharField(validators=[phoneNumberRegex], max_length=16, unique=True, verbose_name="Номер телефона для связи")

    timeToBus = models.IntegerField(validators=[MaxValueValidator(60)], verbose_name="Время до ближайшей автобусной остановки в минутах")
    timeToTrain = models.IntegerField(validators=[MaxValueValidator(60)], verbose_name="Время до ближайшей Ж/Д станции в минутах")

    """Параметры квартиры"""
    isFurniture = models.BooleanField(verbose_name="Имеется мебель в квартире")
    isAnimal = models.BooleanField(verbose_name="Можно с питомцем")
    isTelevision = models.BooleanField(verbose_name="Имеется телевизор в квартире")
    isChild = models.BooleanField(verbose_name="Можно с детьми")
    isInternet = models.BooleanField(verbose_name="Проведен интернет в квартире")
    isBathroom = models.BooleanField(verbose_name="Имеется санузел в квартире")
    isRefrigerator = models.BooleanField(verbose_name="Имеется холодильник в квартире")
    isWasher = models.BooleanField(verbose_name="Имеется стиральная машинка в квартире")
    isAirConditioning = models.BooleanField(verbose_name="Имеется кондиционер в квартире")
    isFreshRepair = models.BooleanField(verbose_name="Недавно был ремонт в квартире")

    """Параметры дома"""
    isElevator = models.BooleanField(verbose_name="Имеется лифт в доме")
    isParking = models.BooleanField(verbose_name="Имеется закрытая парковка у дома")
    isGarbageChute = models.BooleanField(verbose_name="Имеется мусоропровод в доме")
    isConcierge = models.BooleanField(verbose_name="Имеется консьерж в доме")

    views = models.ManyToManyField(IPAddresses, related_name="post_views", blank=True)
    
    dateCreate = models.DateField(auto_now_add=True, editable=False, verbose_name="Дата добавления квартиры")

    def total_views(self):
        return self.views.count()

    class Meta:
        verbose_name = "Квартира"
        verbose_name_plural = "Квартиры"
        ordering = ['-dateCreate']


class Photo(models.Model):
    """Модель данных фотографий квартир"""
    apartament = models.ForeignKey(Apartament, on_delete = models.CASCADE, verbose_name="Квартира")
    image = models.ImageField(upload_to='photos/%Y/%m/%d', verbose_name="Фотография")

    class Meta:
        verbose_name = "Фотография"
        verbose_name_plural = "Фотографии"

# TODO: Add auth
class User(models.Model):
    """Модель данных пользователя"""

    favorites_apartments =          models.CharField(max_length=100, verbose_name="Избранные квартиры (CSV)")
    comparison_apartments =         models.CharField(max_length=100, verbose_name="Квартиры для сравнения (CSV)")
    psych_test_result =             models.IntegerField(validators=[MaxValueValidator(100)], null=True, verbose_name="Результат психологического теста")
    openid_addr =                   models.CharField(max_length=1000, null=False, verbose_name='Адрес Open ID Connect (login@provider.com, для ВВГУ - login@vvsu.ru)')
    name =                          models.CharField(max_length=256, verbose_name='ФИО Пользователя')
    date_of_birth =                 models.DateField(verbose_name='Дата рождения пользователя')
    about_me =                      models.CharField(max_length=1000, verbose_name='Поле "О Себе"')
    gender =                        models.CharField(max_length=1, verbose_name='Пол пользователя (f,m,n,?)')

    phone =                         models.CharField(max_length=30, verbose_name='Телефон пользователя в международном формате (+00000000)', null=True)
    email =                         models.CharField(max_length=1000, verbose_name='Почтовый ящик пользователя в формате user@example.com', null=True)
    telegram =                      models.CharField(max_length=1000, verbose_name='Телеграм пользователя', null=True)
    discord =                       models.CharField(max_length=1000, verbose_name='Дискорд ник пользователя', null=True)
    
    # as in "City wok"
    city =                          models.CharField(max_length=1000, verbose_name='Город пользователя', null=True)

    role =                          models.CharField(max_length=1, verbose_name='Роль пользователя (s - student, a - admin, m - moderator)', null=False)

    class Meta:
        verbose_name = "Пользователь"
        verbose_name_plural = "Пользователи"