import datetime

from django import forms
from django.core.exceptions import ValidationError


class DocumentUploadForm(forms.Form):
    MAX_FILES = 5  # Максимальное количество файлов для загрузки

    doc_expire_date = forms.DateField(
        required=False,
        widget=forms.DateInput(attrs={
            'class': 'form-control',
            'type': 'date',
        }),
        label='Дата окончания действия документа (при наличии)'
    )
    doc_file = forms.FileField(
        widget=forms.ClearableFileInput(attrs={
            'multiple': True,
            'id': 'doc-file-input'
        }),
        required=True,
    )

    # Дата истечения срока документа не может быть в прошлом
    def clean_doc_expire_date(self):
        doc_expire_date = self.cleaned_data.get('doc_expire_date')
        if doc_expire_date and doc_expire_date < datetime.date.today():
            raise ValidationError("Дата окончания действия документа не может быть в прошлом.")
        return doc_expire_date

    # Загружаемые файлы должны иметь только допустимый тип и расширение
    def clean_doc_file(self):
        files = self.files.getlist('doc_file')
        allowed_mime_types = ['image/jpeg', 'image/png', 'application/pdf']
        allowed_extensions = ['jpg', 'jpeg', 'png', 'pdf']

        # Проверка на максимальное количество файлов
        if len(files) > self.MAX_FILES:
            raise ValidationError(f"Вы можете загрузить не более {self.MAX_FILES} файлов.")
        
        for file in files:
            # Проверяем расширение файла
            extension = file.name.split('.')[-1].lower()
            if extension not in allowed_extensions:
                raise ValidationError(f"Файл {file.name} имеет недопустимое расширение. Допустимые расширения: {', '.join(allowed_extensions)}.")

            # Проверяем MIME тип файла
            if file.content_type not in allowed_mime_types:
                raise ValidationError(f"Файл {file.name} имеет недопустимый формат. Допустимые форматы: {', '.join(allowed_mime_types)}.")
        
        return files