from django import forms

from assets import models
from django.db.models import Q


class AssetForm(forms.ModelForm):
    related_models = {
        'asset': models.Asset,
        'supplier': models.Supplier
    }

    class Meta:
        model = models.Asset
        fields = '__all__'
        exclude = ['asset_id_prefix', 'asset_id_number', 'last_audited_at', 'last_audited_by']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['date_sold'].widget.format = '%Y-%m-%d'
        self.fields['date_acquired'].widget.format = '%Y-%m-%d'


class AssetAuditForm(AssetForm):
    class Meta(AssetForm.Meta):
        # Prevents assets losing existing data that isn't included in the audit form
        exclude = ['asset_id_prefix', 'asset_id_number', 'last_audited_at', 'last_audited_by',
                   'parent', 'purchased_from', 'purchase_price', 'comments']


class AssetSearchForm(forms.Form):
    query = forms.CharField(required=False)
    category = forms.ModelMultipleChoiceField(models.AssetCategory.objects.all(), required=False)
    status = forms.ModelMultipleChoiceField(models.AssetStatus.objects.all(), required=False)


class SupplierForm(forms.ModelForm):
    class Meta:
        model = models.Supplier
        fields = '__all__'


class SupplierSearchForm(forms.Form):
    query = forms.CharField(required=False)


class CableTypeForm(forms.ModelForm):
    class Meta:
        model = models.CableType
        fields = '__all__'

    def clean(self):
        form_data = self.cleaned_data
        queryset = models.CableType.objects.filter(Q(plug=form_data['plug']) & Q(socket=form_data['socket']) & Q(circuits=form_data['circuits']) & Q(cores=form_data['cores']))
        # Being identical to itself shouldn't count...
        if queryset.exists() and self.instance.pk != queryset[0].pk:
            raise forms.ValidationError("A cable type that exactly matches this one already exists, please use that instead.", code="notunique")
        return form_data
