import axios from 'axios'
import { PageNumberPaginationParameters, unique } from '.'
import { ElementTiny, PageNumberPagination, UUID } from '@/types'
import { Entity, EntityLight, EntityType, TranscriptionEntity } from '@/types/entity'

// Retrieve an entity
export const retrieveEntity = unique(async (id: UUID): Promise<Entity> => (await axios.get(`/entity/${id}/`)).data)

export interface CorpusEntitiesListParameters extends PageNumberPaginationParameters {
  name?: string
  parent?: UUID
}

// List entities in a corpus
export const listCorpusEntities = unique(async (id: UUID, params: CorpusEntitiesListParameters = {}): Promise<PageNumberPagination<EntityLight>> => (await axios.get(`/corpus/${id}/entities/`, { params })).data)

// List all elements linked to an entity
export const listEntityElements = unique(async (id: UUID, params: PageNumberPaginationParameters = {}): Promise<PageNumberPagination<ElementTiny>> => (await axios.get(`/entity/${id}/elements/`, { params })).data)

interface TranscriptionEntityListParameters extends PageNumberPaginationParameters {
  entity_worker_run?: UUID | false
  entity_worker_version?: UUID | false
  worker_run?: UUID | false
  worker_version?: UUID | false
}

// List all entities linked to a transcription
export const listTranscriptionEntities = unique(async (id: UUID, params: TranscriptionEntityListParameters = {}): Promise<PageNumberPagination<TranscriptionEntity>> => (await axios.get(`/transcription/${id}/entities/`, { params })).data)

// List a corpus's entity types
export const listCorpusEntityTypes = unique(async (id: UUID, params: PageNumberPaginationParameters = {}): Promise<PageNumberPagination<EntityType>> => (await axios.get(`/corpus/${id}/entity-types/`, { params })).data)

type EntityTypeCreatePayload = Omit<EntityType, 'id'>
type EntityTypeUpdatePayload = Partial<EntityTypeCreatePayload>

// Create a new corpus entity type
export const createCorpusEntityType = async (type: EntityTypeCreatePayload): Promise<EntityType> => (await axios.post('/entity/types/', type)).data

// Edit a corpus entity type
export const updateCorpusEntityType = async (id: UUID, data: EntityTypeUpdatePayload): Promise<EntityType> => (await axios.patch(`/entity/types/${id}/`, data)).data

// Delete a corpus entity type
export const deleteCorpusEntityType = unique(async (id: UUID) => (await axios.delete(`/entity/types/${id}/`)).data)