from rest_framework import serializers
from organizations_ext.serializers.base_serializers import (
    OrganizationReferenceSerializer,
)
from teams.serializers import RelatedTeamSerializer
from .base_serializers import ProjectReferenceWithMemberSerializer
from ..models import ProjectKey


class ProjectKeySerializer(serializers.ModelSerializer):
    dateCreated = serializers.DateTimeField(source="created", read_only=True)
    id = serializers.CharField(source="public_key_hex", read_only=True)
    dsn = serializers.SerializerMethodField(read_only=True)
    public = serializers.CharField(source="public_key_hex", read_only=True)
    projectId = serializers.PrimaryKeyRelatedField(source="project", read_only=True)

    class Meta:
        model = ProjectKey
        fields = ("dateCreated", "dsn", "id", "label", "public", "projectId")

    def get_dsn(self, obj):
        return {
            "public": obj.get_dsn(),
            "secret": obj.get_dsn(),  # Deprecated but required for @sentry/wizard
            "security": obj.get_dsn_security(),
        }


class ProjectSerializer(ProjectReferenceWithMemberSerializer):
    avatar = serializers.SerializerMethodField()
    color = serializers.SerializerMethodField()
    dateCreated = serializers.DateTimeField(source="created", read_only=True)
    features = serializers.SerializerMethodField()
    firstEvent = serializers.DateTimeField(source="first_event", read_only=True)
    hasAccess = serializers.SerializerMethodField()
    id = serializers.CharField(read_only=True)
    isBookmarked = serializers.SerializerMethodField()
    isInternal = serializers.SerializerMethodField()
    isPublic = serializers.SerializerMethodField()
    organization = OrganizationReferenceSerializer(read_only=True)
    teams = RelatedTeamSerializer(source="team_set", read_only=True, many=True)
    scrubIPAddresses = serializers.BooleanField(
        source="scrub_ip_addresses", required=False
    )

    class Meta(ProjectReferenceWithMemberSerializer.Meta):
        fields = (
            "avatar",
            "color",
            "features",
            "firstEvent",
            "hasAccess",
            "id",
            "isBookmarked",
            "isInternal",
            "isMember",
            "isPublic",
            "name",
            "organization",
            "teams",
            "scrubIPAddresses",
            "slug",
            "dateCreated",
            "platform",
        )
        read_only_fields = ("slug", "date_added")

    def get_avatar(self, obj):
        return {"avatarType": "", "avatarUuid": None}

    def get_color(self, obj):
        return ""

    def get_features(self, obj):
        return []

    def get_hasAccess(self, obj):
        return True

    def get_isBookmarked(self, obj):
        return False

    def get_isInternal(self, obj):
        return False

    def get_isPublic(self, obj):
        return False


class ProjectWithKeysSerializer(ProjectSerializer):
    keys = ProjectKeySerializer(many=True, source="projectkey_set")

    class Meta(ProjectSerializer.Meta):
        fields = ProjectSerializer.Meta.fields + ("keys",)