// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.

package atproto

// schema: com.atproto.admin.getSubjectStatus

import (
	"context"
	"encoding/json"
	"fmt"

	"github.com/bluesky-social/indigo/lex/util"
)

// AdminGetSubjectStatus_Output is the output of a com.atproto.admin.getSubjectStatus call.
type AdminGetSubjectStatus_Output struct {
	Deactivated *AdminDefs_StatusAttr                 `json:"deactivated,omitempty" cborgen:"deactivated,omitempty"`
	Subject     *AdminGetSubjectStatus_Output_Subject `json:"subject" cborgen:"subject"`
	Takedown    *AdminDefs_StatusAttr                 `json:"takedown,omitempty" cborgen:"takedown,omitempty"`
}

type AdminGetSubjectStatus_Output_Subject struct {
	AdminDefs_RepoRef     *AdminDefs_RepoRef
	RepoStrongRef         *RepoStrongRef
	AdminDefs_RepoBlobRef *AdminDefs_RepoBlobRef
}

func (t *AdminGetSubjectStatus_Output_Subject) MarshalJSON() ([]byte, error) {
	if t.AdminDefs_RepoRef != nil {
		t.AdminDefs_RepoRef.LexiconTypeID = "com.atproto.admin.defs#repoRef"
		return json.Marshal(t.AdminDefs_RepoRef)
	}
	if t.RepoStrongRef != nil {
		t.RepoStrongRef.LexiconTypeID = "com.atproto.repo.strongRef"
		return json.Marshal(t.RepoStrongRef)
	}
	if t.AdminDefs_RepoBlobRef != nil {
		t.AdminDefs_RepoBlobRef.LexiconTypeID = "com.atproto.admin.defs#repoBlobRef"
		return json.Marshal(t.AdminDefs_RepoBlobRef)
	}
	return nil, fmt.Errorf("cannot marshal empty enum")
}
func (t *AdminGetSubjectStatus_Output_Subject) UnmarshalJSON(b []byte) error {
	typ, err := util.TypeExtract(b)
	if err != nil {
		return err
	}

	switch typ {
	case "com.atproto.admin.defs#repoRef":
		t.AdminDefs_RepoRef = new(AdminDefs_RepoRef)
		return json.Unmarshal(b, t.AdminDefs_RepoRef)
	case "com.atproto.repo.strongRef":
		t.RepoStrongRef = new(RepoStrongRef)
		return json.Unmarshal(b, t.RepoStrongRef)
	case "com.atproto.admin.defs#repoBlobRef":
		t.AdminDefs_RepoBlobRef = new(AdminDefs_RepoBlobRef)
		return json.Unmarshal(b, t.AdminDefs_RepoBlobRef)

	default:
		return nil
	}
}

// AdminGetSubjectStatus calls the XRPC method "com.atproto.admin.getSubjectStatus".
func AdminGetSubjectStatus(ctx context.Context, c util.LexClient, blob string, did string, uri string) (*AdminGetSubjectStatus_Output, error) {
	var out AdminGetSubjectStatus_Output

	params := map[string]interface{}{}
	if blob != "" {
		params["blob"] = blob
	}
	if did != "" {
		params["did"] = did
	}
	if uri != "" {
		params["uri"] = uri
	}
	if err := c.LexDo(ctx, util.Query, "", "com.atproto.admin.getSubjectStatus", params, nil, &out); err != nil {
		return nil, err
	}

	return &out, nil
}
