from django.contrib.auth import get_user_model
from django.db import models
from django.db.models import SET_NULL

from utils.string_util import uuid_8, uuid_16, uuid_32, uuid_36


class IdField(models.CharField):
    """
    id = IdField()
    """

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = kwargs.get('max_length', 8)
        kwargs['primary_key'] = kwargs.get('primary_key', True)
        kwargs['unique'] = kwargs.get('unique', True)
        kwargs['db_index'] = kwargs.get('db_index', True)
        kwargs['default'] = kwargs.get('default', uuid_8)
        kwargs['null'] = kwargs.get('null', False)
        kwargs['blank'] = kwargs.get('blank', False)
        kwargs['verbose_name'] = kwargs.get('verbose_name', 'ID')
        kwargs['help_text'] = kwargs.get('help_text', 'ID')
        super().__init__(*args, **kwargs)


class UUID8Field(models.CharField):

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = kwargs.get('max_length', 8)
        kwargs['default'] = kwargs.get('default', uuid_8)
        kwargs['verbose_name'] = kwargs.get('verbose_name', 'UUID')
        kwargs['help_text'] = kwargs.get('help_text', 'UUID')
        super().__init__(*args, **kwargs)


class UUID16Field(models.CharField):

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = kwargs.get('max_length', 16)
        kwargs['default'] = kwargs.get('default', uuid_16)
        kwargs['verbose_name'] = kwargs.get('verbose_name', 'UUID')
        kwargs['help_text'] = kwargs.get('help_text', 'UUID')
        super().__init__(*args, **kwargs)


class UUID32Field(models.CharField):

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = kwargs.get('max_length', 32)
        kwargs['default'] = kwargs.get('default', uuid_32)
        kwargs['verbose_name'] = kwargs.get('verbose_name', 'UUID')
        kwargs['help_text'] = kwargs.get('help_text', 'UUID')
        super().__init__(*args, **kwargs)


class UUID36Field(models.CharField):

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = kwargs.get('max_length', 36)
        kwargs['unique'] = kwargs.get('unique', True)
        kwargs['default'] = kwargs.get('default', uuid_36)
        kwargs['verbose_name'] = kwargs.get('verbose_name', 'UUID')
        kwargs['help_text'] = kwargs.get('help_text', 'UUID')
        super().__init__(*args, **kwargs)


class DescriptionField(models.TextField):
    """
    description = DescriptionField()
    """

    def __init__(self, *args, **kwargs):
        if kwargs.get('null', True):
            kwargs['default'] = kwargs.get('default', '')
        kwargs['blank'] = kwargs.get('blank', True)
        kwargs['null'] = kwargs.get('null', True)
        kwargs['verbose_name'] = kwargs.get('verbose_name', '描述')
        kwargs['help_text'] = kwargs.get('help_text', '') or kwargs.get('verbose_name', '描述')
        super().__init__(*args, **kwargs)


class UserForeignKeyField(models.ForeignKey):
    """
    user = UserForeignKeyField()
    """

    def __init__(self, to=None, on_delete=None, related_name=None, related_query_name=None, limit_choices_to=None,
                 parent_link=False, to_field=None, db_constraint=False, **kwargs):
        if to is None:
            to = get_user_model()
        if to_field is None:
            to_field = 'id'
        if on_delete is None:
            on_delete = SET_NULL
        kwargs['verbose_name'] = kwargs.get('verbose_name', '关联的用户')
        kwargs['help_text'] = kwargs.get('help_text', '') or kwargs.get('verbose_name', '关联的用户')
        kwargs['editable'] = kwargs.get('default', False)
        super().__init__(to, on_delete, related_name, related_query_name, limit_choices_to, parent_link, to_field,
                         db_constraint, **kwargs)


class UpdateDateTimeField(models.DateTimeField):
    """
    update_datetime = ModifyDateTimeField()
    """

    def __init__(self, verbose_name=None, name=None, auto_now=True, auto_now_add=False, **kwargs):
        verbose_name = verbose_name or '修改时间'
        kwargs['help_text'] = kwargs.get('help_text', '修改时间')
        kwargs['editable'] = kwargs.get('default', False)
        kwargs['blank'] = kwargs.get('blank', True)
        kwargs['null'] = kwargs.get('null', True)
        super().__init__(verbose_name, name, auto_now, auto_now_add, **kwargs)


class CreateDateTimeField(models.DateTimeField):
    """
    create_datetime = CreateDateTimeField()
    """

    def __init__(self, verbose_name=None, name=None, auto_now=False, auto_now_add=True, **kwargs):
        verbose_name = verbose_name or '创建时间'
        kwargs['help_text'] = kwargs.get('help_text', '创建时间')
        kwargs['editable'] = kwargs.get('default', False)
        kwargs['blank'] = kwargs.get('blank', True)
        kwargs['null'] = kwargs.get('null', True)
        super().__init__(verbose_name, name, auto_now, auto_now_add, **kwargs)


class CreatorCharField(models.CharField):
    """
    creator = CreatorCharField()
    """

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = kwargs.get('max_length', 255)
        kwargs['null'] = kwargs.get('null', True)
        kwargs['blank'] = kwargs.get('blank', True)
        kwargs['verbose_name'] = kwargs.get('verbose_name', '创建者')
        kwargs['help_text'] = kwargs.get('help_text', '该记录的创建者')
        super().__init__(*args, **kwargs)


class ModifierCharField(models.CharField):
    """
    modifier = ModifierCharField()
    """

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = kwargs.get('max_length', 255)
        kwargs['null'] = kwargs.get('null', True)
        kwargs['blank'] = kwargs.get('blank', True)
        kwargs['verbose_name'] = kwargs.get('verbose_name', '修改者')
        kwargs['help_text'] = kwargs.get('help_text', '该记录最后修改者')
        super().__init__(*args, **kwargs)