/**
 * API Client para Units of Measure
 * Gestiona las operaciones CRUD para unidades de medida
 */
import { api } from '$lib/api';

export interface UnitOfMeasure {
	id: number;
	code: string;
	description: string | null;
	description_en: string | null;
	customs_code: string | null;
	american_code: string | null;
	ace_code: string | null;
	oma_code: string | null;
}

export interface UnitOfMeasureListResponse {
	items: UnitOfMeasure[];
	total: number;
	page: number;
	page_size: number;
}

export interface CreateUnitOfMeasureData {
	code: string;
	description?: string | null;
	description_en?: string | null;
	customs_code?: string | null;
	american_code?: string | null;
	ace_code?: string | null;
	oma_code?: string | null;
}

export interface UpdateUnitOfMeasureData {
	code?: string;
	description?: string | null;
	description_en?: string | null;
	customs_code?: string | null;
	american_code?: string | null;
	ace_code?: string | null;
	oma_code?: string | null;
}

/**
 * API para Units of Measure
 */
export const unitsOfMeasureApi = {
	/**
	 * Lista todas las unidades de medida con paginación
	 * @param companyId - ID de la compañía
	 * @param page - Número de página (por defecto 1)
	 * @param pageSize - Tamaño de página (por defecto 50)
	 */
	list: (companyId: number, page = 1, pageSize = 50) => {
		const params = new URLSearchParams({
			company_id: companyId.toString(),
			page: page.toString(),
			page_size: pageSize.toString()
		});
		return api.get<UnitOfMeasureListResponse>(
			`/v1/a76/units-of-measure/?${params.toString()}`
		);
	},

	/**
	 * Obtiene una unidad de medida por ID
	 * @param companyId - ID de la compañía
	 * @param id - ID de la unidad de medida
	 */
	get: (companyId: number, id: number) =>
		api.get<UnitOfMeasure>(`/v1/a76/units-of-measure/${id}?company_id=${companyId}`),

	/**
	 * Crea una nueva unidad de medida
	 * @param companyId - ID de la compañía
	 * @param data - Datos de la unidad de medida a crear
	 */
	create: (companyId: number, data: CreateUnitOfMeasureData) =>
		api.post<UnitOfMeasure>(`/v1/a76/units-of-measure/?company_id=${companyId}`, data),

	/**
	 * Actualiza una unidad de medida existente
	 * @param companyId - ID de la compañía
	 * @param id - ID de la unidad de medida a actualizar
	 * @param data - Datos a actualizar
	 */
	update: (companyId: number, id: number, data: UpdateUnitOfMeasureData) =>
		api.put<UnitOfMeasure>(
			`/v1/a76/units-of-measure/${id}/?company_id=${companyId}`,
			data
		),

	/**
	 * Elimina una unidad de medida
	 * @param companyId - ID de la compañía
	 * @param id - ID de la unidad de medida a eliminar
	 */
	delete: (companyId: number, id: number) =>
		api.delete(`/v1/a76/units-of-measure/${id}/?company_id=${companyId}`)
};
