"""
Data Policy Serializers - API serialization for data policies.
"""
from rest_framework import serializers

from .models import (
    DataPolicy,
    DataScope,
    UserDataScope,
    RoleDataScope,
    DataAccessLog,
)


class DataPolicySerializer(serializers.ModelSerializer):
    """Serializer for DataPolicy model."""

    class Meta:
        model = DataPolicy
        fields = [
            'id',
            'name',
            'slug',
            'description',
            'module',
            'resource',
            'policy_type',
            'actions',
            'conditions',
            'priority',
            'is_allow',
            'is_active',
            'created_at',
            'updated_at',
        ]
        read_only_fields = ['created_at', 'updated_at']


class DataPolicyCreateSerializer(serializers.ModelSerializer):
    """Serializer for creating/updating DataPolicy."""

    class Meta:
        model = DataPolicy
        fields = [
            'name',
            'slug',
            'description',
            'module',
            'resource',
            'policy_type',
            'actions',
            'conditions',
            'priority',
            'is_allow',
            'is_active',
        ]


class DataScopeSerializer(serializers.ModelSerializer):
    """Serializer for DataScope model."""

    class Meta:
        model = DataScope
        fields = [
            'id',
            'name',
            'slug',
            'description',
            'scope_type',
            'configuration',
            'is_active',
            'created_at',
            'updated_at',
        ]
        read_only_fields = ['created_at', 'updated_at']


class UserDataScopeSerializer(serializers.ModelSerializer):
    """Serializer for UserDataScope model."""

    scope_name = serializers.CharField(source='scope.name', read_only=True)

    class Meta:
        model = UserDataScope
        fields = [
            'id',
            'user',
            'scope',
            'scope_name',
            'module',
            'resource',
            'parameters',
            'is_active',
            'created_at',
            'updated_at',
        ]
        read_only_fields = ['created_at', 'updated_at']


class RoleDataScopeSerializer(serializers.ModelSerializer):
    """Serializer for RoleDataScope model."""

    scope_name = serializers.CharField(source='scope.name', read_only=True)

    class Meta:
        model = RoleDataScope
        fields = [
            'id',
            'role',
            'scope',
            'scope_name',
            'module',
            'resource',
            'parameters',
            'is_active',
            'created_at',
        ]
        read_only_fields = ['created_at']


class DataAccessLogSerializer(serializers.ModelSerializer):
    """Serializer for DataAccessLog model."""

    class Meta:
        model = DataAccessLog
        fields = [
            'id',
            'user',
            'module',
            'resource',
            'record_id',
            'action',
            'fields_accessed',
            'ip_address',
            'was_allowed',
            'policy_applied',
            'accessed_at',
        ]
        read_only_fields = ['accessed_at']


class PolicyTestSerializer(serializers.Serializer):
    """Serializer for testing policy application."""

    policy_id = serializers.IntegerField(required=False)
    model_name = serializers.CharField()
    user_id = serializers.UUIDField()

    def validate_model_name(self, value):
        """Validate model name format."""
        if '.' not in value:
            raise serializers.ValidationError(
                "Model name must be in format 'app_label.model_name'."
            )
        return value
