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

package atproto

// schema: com.atproto.moderation.createReport

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

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

// ModerationCreateReport_Input is the input argument to a com.atproto.moderation.createReport call.
type ModerationCreateReport_Input struct {
	// reason: Additional context about the content and violation.
	Reason *string `json:"reason,omitempty" cborgen:"reason,omitempty"`
	// reasonType: Indicates the broad category of violation the report is for.
	ReasonType *string                               `json:"reasonType" cborgen:"reasonType"`
	Subject    *ModerationCreateReport_Input_Subject `json:"subject" cborgen:"subject"`
}

type ModerationCreateReport_Input_Subject struct {
	AdminDefs_RepoRef *AdminDefs_RepoRef
	RepoStrongRef     *RepoStrongRef
}

func (t *ModerationCreateReport_Input_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)
	}
	return nil, fmt.Errorf("cannot marshal empty enum")
}
func (t *ModerationCreateReport_Input_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)

	default:
		return nil
	}
}

// ModerationCreateReport_Output is the output of a com.atproto.moderation.createReport call.
type ModerationCreateReport_Output struct {
	CreatedAt  string                                 `json:"createdAt" cborgen:"createdAt"`
	Id         int64                                  `json:"id" cborgen:"id"`
	Reason     *string                                `json:"reason,omitempty" cborgen:"reason,omitempty"`
	ReasonType *string                                `json:"reasonType" cborgen:"reasonType"`
	ReportedBy string                                 `json:"reportedBy" cborgen:"reportedBy"`
	Subject    *ModerationCreateReport_Output_Subject `json:"subject" cborgen:"subject"`
}

type ModerationCreateReport_Output_Subject struct {
	AdminDefs_RepoRef *AdminDefs_RepoRef
	RepoStrongRef     *RepoStrongRef
}

func (t *ModerationCreateReport_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)
	}
	return nil, fmt.Errorf("cannot marshal empty enum")
}
func (t *ModerationCreateReport_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)

	default:
		return nil
	}
}

// ModerationCreateReport calls the XRPC method "com.atproto.moderation.createReport".
func ModerationCreateReport(ctx context.Context, c *xrpc.Client, input *ModerationCreateReport_Input) (*ModerationCreateReport_Output, error) {
	var out ModerationCreateReport_Output
	if err := c.Do(ctx, xrpc.Procedure, "application/json", "com.atproto.moderation.createReport", nil, input, &out); err != nil {
		return nil, err
	}

	return &out, nil
}
