input AddTranscriptSegmentInput {
	CallId: ID!
	Status: CallStatus!
	SegmentId: ID!
	StartTime: Float!
	EndTime: Float!
	Transcript: String!
	IsPartial: Boolean!
	Channel: Channel!
	CreatedAt: AWSDateTime
	ExpiresAfter: AWSTimestamp
	Sentiment: Sentiment
	SentimentScore: SentimentScoreInput
	SentimentWeighted: Float
}

type Call implements DynamoDbBase @aws_cognito_user_pools
@aws_iam {
	PK: ID!
	SK: ID!
	CreatedAt: AWSDateTime!
	UpdatedAt: AWSDateTime!
	ExpiresAfter: AWSTimestamp
	CallId: ID!
	CustomerPhoneNumber: String
	Sentiment: SentimentAggregation
	SystemPhoneNumber: String
	Status: CallStatus
	RecordingUrl: String
	PcaUrl: String
	TotalConversationDurationMillis: Float
	AgentId: String
	Metadatajson: String
	CallCategories: [String]
	IssuesDetected: String
	CallSummaryText: String
}

type CallList @aws_cognito_user_pools
@aws_iam {
	Calls: [CallListItem]
	nextToken: String
}

type CallListItem implements DynamoDbBase @aws_cognito_user_pools
@aws_iam {
	PK: ID!
	SK: ID!
	CreatedAt: AWSDateTime!
	UpdatedAt: AWSDateTime!
	ExpiresAfter: AWSTimestamp
	CallId: ID!
}

enum CallStatus {
	STARTED
	TRANSCRIBING
	ERRORED
	ENDED
}

enum Channel {
	CALLER
	AGENT
	AGENT_VOICETONE
	CALLER_VOICETONE
	AGENT_ASSISTANT
	CATEGORY_MATCH
}

input CreateCallInput {
	CallId: ID!
	AgentId: String
	CreatedAt: AWSDateTime
	CustomerPhoneNumber: String
	SystemPhoneNumber: String
	Metadatajson: String
	ExpiresAfter: AWSTimestamp
}

type CreateCallOutput @aws_iam {
	CallId: ID!
}

interface DynamoDbBase {
	PK: ID!
	SK: ID!
	CreatedAt: AWSDateTime!
	UpdatedAt: AWSDateTime
	ExpiresAfter: AWSTimestamp
}

type Mutation @aws_iam {
	createCall(input: CreateCallInput!): CreateCallOutput
	updateCallStatus(input: UpdateCallStatusInput!): Call
	updateCallAggregation(input: UpdateCallAggregationInput!): Call
	updateRecordingUrl(input: UpdateRecordingUrlInput!): Call
	updatePcaUrl(input: UpdatePcaUrlInput!): Call
	updateAgent(input: UpdateAgentInput!): Call
	addCallCategory(input: AddCallCategoryInput!): Call
	addIssuesDetected(input: AddIssuesDetectedInput!): Call
	addCallSummaryText(input: AddCallSummaryTextInput!): Call
	addTranscriptSegment(input: AddTranscriptSegmentInput!): TranscriptSegment
}

type OverallSentiment @aws_cognito_user_pools
@aws_iam {
	AGENT: Float
	CALLER: Float
	AGENT_VOICETONE: Float
	CALLER_VOICETONE: Float
}

input OverallSentimentInput {
	AGENT: Float
	CALLER: Float
	AGENT_VOICETONE: Float
	CALLER_VOICETONE: Float
}

type Query @aws_cognito_user_pools
@aws_iam {
	getCall(CallId: ID!): Call
	getTranscriptSegments(callId: ID!, isPartial: Boolean): TranscriptSegmentList
	getTranscriptSegmentsWithSentiment(callId: ID!): TranscriptSegmentsWithSentimentList
	listCalls(endDateTime: AWSDateTime, startDateTime: AWSDateTime): CallList
	listCallsDateHour(date: AWSDate, hour: Int): CallList
	listCallsDateShard(date: AWSDate, shard: Int): CallList
}

enum Sentiment {
	POSITIVE
	NEGATIVE
	NEUTRAL
	MIXED
}

type SentimentAggregation @aws_cognito_user_pools
@aws_iam {
	OverallSentiment: OverallSentiment
	SentimentByPeriod: SentimentByPeriod
}

input SentimentAggregationInput {
	OverallSentiment: OverallSentimentInput
	SentimentByPeriod: SentimentByPeriodInput
}

type SentimentByChannel @aws_cognito_user_pools
@aws_iam {
	AGENT: [SentimentByChannelEntry]
	CALLER: [SentimentByChannelEntry]
	AGENT_VOICETONE: [SentimentByChannelEntry]
	CALLER_VOICETONE: [SentimentByChannelEntry]
}

type SentimentByChannelEntry @aws_cognito_user_pools
@aws_iam {
	BeginOffsetMillis: Float
	EndOffsetMillis: Float
	Score: Float
}

input SentimentByChannelEntryInput {
	BeginOffsetMillis: Float
	EndOffsetMillis: Float
	Score: Float
}

input SentimentByChannelInput {
	AGENT: [SentimentByChannelEntryInput]
	CALLER: [SentimentByChannelEntryInput]
	AGENT_VOICETONE: [SentimentByChannelEntryInput]
	CALLER_VOICETONE: [SentimentByChannelEntryInput]
}

type SentimentByPeriod @aws_cognito_user_pools
@aws_iam {
	QUARTER: SentimentByChannel
}

input SentimentByPeriodInput {
	QUARTER: SentimentByChannelInput
}

type SentimentScore @aws_cognito_user_pools
@aws_iam {
	Positive: Float!
	Negative: Float!
	Neutral: Float!
	Mixed: Float!
}

input SentimentScoreInput {
	Positive: Float!
	Negative: Float!
	Neutral: Float!
	Mixed: Float!
}

type Subscription {
	onCreateCall: CreateCallOutput
		@aws_subscribe(mutations: ["createCall"])
	onUpdateCall(CallId: ID): Call
		@aws_subscribe(mutations: ["updateCallStatus","updateCallAggregation","updateRecordingUrl","updatePcaUrl","updateAgent", "addCallCategory", "addIssuesDetected", "addCallSummaryText"])
	onAddTranscriptSegment(CallId: ID, Channel: String): TranscriptSegment
		@aws_subscribe(mutations: ["addTranscriptSegment"])
}

type TranscriptSegment implements DynamoDbBase @aws_cognito_user_pools
@aws_iam {
	PK: ID!
	SK: ID!
	CreatedAt: AWSDateTime!
	UpdatedAt: AWSDateTime
	ExpiresAfter: AWSTimestamp
	CallId: ID!
	SegmentId: ID!
	StartTime: Float!
	EndTime: Float!
	Transcript: String!
	IsPartial: Boolean!
	Channel: Channel!
	Sentiment: Sentiment
	SentimentScore: SentimentScore
	SentimentWeighted: Float
}

type TranscriptSegmentList @aws_cognito_user_pools
@aws_iam {
	TranscriptSegments: [TranscriptSegment]
	nextToken: String
}

type TranscriptSegmentWithSentiment implements DynamoDbBase @aws_cognito_user_pools
@aws_iam {
	PK: ID!
	SK: ID!
	CreatedAt: AWSDateTime!
	UpdatedAt: AWSDateTime
	ExpiresAfter: AWSTimestamp
	CallId: ID!
	SegmentId: ID!
	StartTime: Float!
	EndTime: Float!
	Channel: Channel!
	Sentiment: Sentiment
	SentimentWeighted: Float
}
type TranscriptSegmentsWithSentimentList @aws_cognito_user_pools
@aws_iam {
	TranscriptSegmentsWithSentiment: [TranscriptSegmentWithSentiment]
	nextToken: String
}
input UpdateAgentInput {
	CallId: ID!
	AgentId: String!
	UpdatedAt: AWSDateTime
}

input AddCallCategoryInput {
	CallId: ID!
	CallCategories: [String]
	UpdatedAt: AWSDateTime
}

input AddIssuesDetectedInput {
	CallId: ID!
	IssuesDetected: String!
	UpdatedAt: AWSDateTime
}

input AddCallSummaryTextInput {
	CallId: ID!
	CallSummaryText: String!
	UpdatedAt: AWSDateTime
}

input UpdateCallAggregationInput {
	CallId: ID!
	UpdatedAt: AWSDateTime
	TotalConversationDurationMillis: Float
	Sentiment: SentimentAggregationInput
}

input UpdateCallStatusInput {
	CallId: ID!
	Status: CallStatus!
	UpdatedAt: AWSDateTime
}

input UpdateRecordingUrlInput {
	CallId: ID!
	RecordingUrl: String!
	UpdatedAt: AWSDateTime
}

input UpdatePcaUrlInput {
	CallId: ID!
	PcaUrl: String!
	UpdatedAt: AWSDateTime
}

schema {
	query: Query
	mutation: Mutation
	subscription: Subscription
}