/**
 * API Client para Pedimentos
 * Gestiona las operaciones CRUD para pedimentos
 */
import { api } from '$lib/api';

// Sub-resource interfaces
export interface PedimentoDates {
	entry_date?: string | null;
	pedimento_date?: string | null;
	payment_date?: string | null;
	rectification_payment_date?: string | null;
	extraction_date?: string | null;
	submission_date?: string | null;
	eucan_date?: string | null;
	original_date?: string | null;
	start_date?: string | null;
	end_date?: string | null;
}

export interface PedimentoPayments {
	acknowledgment?: string | null;
	operation_number?: string | null;
	bank_code?: string | null;
	cashier?: string | null;
	date?: string | null;
	time?: string | null;
	shift?: string | null;
	total_cash_paid?: string | null;
	total_contributions?: string | null;
	counter_payment?: string | null;
	pece_code?: string | null;
}

export interface PedimentoTransportMeans {
	id?: number;
	destination?: number | null;
	entry_exit?: string | null;
	arrival?: string | null;
	departure?: string | null;
}

export interface PedimentoCustomsOffices {
	id?: number;
	dispatch_customs?: string | null;
	entry_exit_customs?: string | null;
}

export interface PedimentoValidation {
	validator?: string | null;
	validation_ack?: string | null;
	pre_ack?: string | null;
	line_signature?: string | null;
	electronic_signature?: string | null;
	certificate_number?: string | null;
	validator_id?: number | null;
	responsible_id?: number | null;
}

export interface PedimentoIncrementables {
	insured_value?: number | null;
	packaging?: number | null;
	freight?: number | null;
	insurance?: number | null;
	others?: number | null;
	deductibles?: number | null;
	currency?: string | null;
	currency_factor?: number | null;
	not_affect_usd_value?: boolean | null;
	not_affect_customs_value?: boolean | null;
}

export interface PedimentoDecrementables {
	freight?: number | null;
	insurance?: number | null;
	loading?: number | null;
	unloading?: number | null;
	others?: number | null;
	currency?: string | null;
	not_affect_usd_value?: boolean | null;
}

export interface PedimentoIndexes {
	update_factor_type?: number | null;
	update_factor?: number | null;
	manual_update_factor?: boolean | null;
}

export interface PedimentoConfigAdditional {
	manual_pedimento_year?: string | null;
	add_po_identifier?: boolean | null;
	do_not_exempt_norms_complement_x?: boolean | null;
	enable_import_invoice_recipient?: boolean | null;
	send_502_validation_file_for_consolidated?: boolean | null;
	add_remove_norms?: boolean | null;
	choose_invoice_cove?: boolean | null;
}

export interface PedimentoConfigCalculations {
	dta_type?: string | null;
	dta_operation?: boolean | null;
	dta_vehicle_count?: boolean | null;
	dta_mixed_rate_8permil?: boolean | null;
	pays_vat?: boolean | null;
	pays_prevalidation?: boolean | null;
	include_sagar_certificate_fee?: boolean | null;
	fixed_vehicle_dta_fee?: boolean | null;
	additional_fixed_fee?: number | null;
	additional_fixed_fee_payment_method?: number | null;
}

export interface PedimentoConfigSurcharges {
	surcharge_igi?: boolean | null;
	surcharge_dta?: boolean | null;
	surcharge_vat?: boolean | null;
	surcharge_isan?: boolean | null;
	surcharge_ieps?: boolean | null;
	surcharge_cc?: boolean | null;
}

export interface PedimentoConfigParameters {
	is_embassy?: boolean | null;
	embassy_dta?: string | null;
	rule_3121_section_ii?: boolean | null;
	use_previous_tariff?: boolean | null;
	use_payment_date_fi?: boolean | null;
	add_state_supplier_record_505?: boolean | null;
	customs_value_calculation?: boolean | null;
	two_decimals_unit_value?: boolean | null;
	customs_value_per_item?: boolean | null;
	is_national_supplier?: boolean | null;
	is_consolidated?: boolean | null;
}

export interface PedimentoConfigUpdates {
	update_vat?: boolean | null;
	update_advalorem?: boolean | null;
	update_dta?: boolean | null;
	update_cc?: boolean | null;
	update_ieps?: boolean | null;
}

export interface PedimentoConfigUpdateRectification {
	update_vat?: boolean | null;
	update_advalorem?: boolean | null;
	update_dta?: boolean | null;
	update_cc?: boolean | null;
	update_ieps?: boolean | null;
	calculate_surcharge?: boolean | null;
}

export interface Identificador {
	id?: number;
	pedimento_id?: number;
	caso: string;
	complemento1: string;
	complemento2: string;
	complemento3: string;
	nodo: string;
	observaciones: string;
}

export interface Pedimento {
	id: number;
	tenant_id: number;
	year?: string | null;
	customs_office?: string | null;
	license?: string | null;
	pedimento_number?: string | null;
	client_id?: number | null;
	operation_type?: string | null;
	pedimento_type?: string | null;
	pedimento_code?: string | null;
	regime?: string | null;
	status?: string | null;
	usd_value?: number | null;
	paid_price?: number | null;
	gross_weight?: number | null;
	exchange_rate?: number | null;
	observations?: string | null;
	created_at: string;
	// Sub-resources
	pedimento_dates?: PedimentoDates | null;
	pedimento_payments?: PedimentoPayments | null;
	pedimento_transport_means?: PedimentoTransportMeans | null;
	pedimento_validation?: PedimentoValidation | null;
	pedimento_incrementables?: PedimentoIncrementables | null;
	pedimento_decrementables?: PedimentoDecrementables | null;
	pedimento_indexes?: PedimentoIndexes | null;
	pedimento_customs_offices?: PedimentoCustomsOffices | null;
	pedimento_config_additional?: PedimentoConfigAdditional | null;
	pedimento_config_calculations?: PedimentoConfigCalculations | null;
	pedimento_config_surcharges?: PedimentoConfigSurcharges | null;
	pedimento_config_parameters?: PedimentoConfigParameters | null;
	pedimento_config_updates?: PedimentoConfigUpdates | null;
	pedimento_config_update_rectification?: PedimentoConfigUpdateRectification | null;
	identificadores?: Identificador[] | null;
}

export interface PedimentoListResponse {
	items: Pedimento[];
	total: number;
	page: number;
	page_size: number;
}

export interface CreatePedimentoData {
	year?: string | null;
	customs_office?: string | null;
	license?: string | null;
	pedimento_number?: string | null;
	client_id?: number | null;
	operation_type?: string | null;
	pedimento_type?: string | null;
	pedimento_code?: string | null;
	regime?: string | null;
	status?: string | null;
	usd_value?: number | null;
	paid_price?: number | null;
	gross_weight?: number | null;
	exchange_rate?: number | null;
	observations?: string | null;
	// Sub-resources
	pedimento_dates?: PedimentoDates | null;
	pedimento_payments?: PedimentoPayments | null;
	pedimento_transport_means?: PedimentoTransportMeans | null;
	pedimento_validation?: PedimentoValidation | null;
	pedimento_incrementables?: PedimentoIncrementables | null;
	pedimento_decrementables?: PedimentoDecrementables | null;
	pedimento_indexes?: PedimentoIndexes | null;
	pedimento_config_additional?: PedimentoConfigAdditional | null;
	pedimento_config_calculations?: PedimentoConfigCalculations | null;
	pedimento_config_surcharges?: PedimentoConfigSurcharges | null;
	pedimento_config_parameters?: PedimentoConfigParameters | null;
	pedimento_config_updates?: PedimentoConfigUpdates | null;
	pedimento_config_update_rectification?: PedimentoConfigUpdateRectification | null;
	identificadores?: Identificador[] | null;
}

export interface UpdatePedimentoData {
	year?: string | null;
	customs_office?: string | null;
	license?: string | null;
	pedimento_number?: string | null;
	client_id?: number | null;
	operation_type?: string | null;
	pedimento_type?: string | null;
	pedimento_code?: string | null;
	regime?: string | null;
	status?: string | null;
	usd_value?: number | null;
	paid_price?: number | null;
	gross_weight?: number | null;
	exchange_rate?: number | null;
	observations?: string | null;
	// Sub-resources
	pedimento_dates?: PedimentoDates | null;
	pedimento_payments?: PedimentoPayments | null;
	pedimento_transport_means?: PedimentoTransportMeans | null;
	pedimento_validation?: PedimentoValidation | null;
	pedimento_incrementables?: PedimentoIncrementables | null;
	pedimento_decrementables?: PedimentoDecrementables | null;
	pedimento_indexes?: PedimentoIndexes | null;
	pedimento_config_additional?: PedimentoConfigAdditional | null;
	pedimento_config_calculations?: PedimentoConfigCalculations | null;
	pedimento_config_surcharges?: PedimentoConfigSurcharges | null;
	pedimento_config_parameters?: PedimentoConfigParameters | null;
	pedimento_config_updates?: PedimentoConfigUpdates | null;
	pedimento_config_update_rectification?: PedimentoConfigUpdateRectification | null;
	identificadores?: Identificador[] | null;
}

export interface PedimentoFilters {
	status?: string;
	client_id?: number;
	pedimento?: string;
	year?: string;
	sort_by?: string;
	sort_order?: 'asc' | 'desc' | string;
}

/**
 * API para Pedimentos
 */
export const pedimentosApi = {
	/**
	 * Lista todos los pedimentos con paginación y filtros
	 * @param page - Número de página (por defecto 1)
	 * @param pageSize - Tamaño de página (por defecto 50)
	 * @param filters - Filtros opcionales
	 * @param companyId - ID de la compañía (por defecto 1)
	 */
	list: (page = 1, pageSize = 50, filters?: PedimentoFilters, companyId?: number) => {
		const params = new URLSearchParams({
			company_id: companyId?.toString() || '',
			page: page.toString(),
			page_size: pageSize.toString()
		});

		if (filters) {
			Object.entries(filters).forEach(([key, value]) => {
				if (value !== undefined && value !== null && value !== '') {
					params.append(key, value.toString());
				}
			});
		}

		return api.get<PedimentoListResponse>(`/v1/a76/pedimentos/?${params.toString()}`);
	},

	/**
	 * Obtiene un pedimento por ID
	 * @param id - ID del pedimento
	 * @param companyId - ID de la compañía (por defecto 1)
	 */
	get: (id: number, companyId?: number) => api.get<Pedimento>(`/v1/a76/pedimentos/${id}/?company_id=${companyId}`),

	/**
	 * Crea un nuevo pedimento
	 * @param data - Datos del pedimento a crear
	 * @param companyId - ID de la compañía (por defecto 1)
	 */
	create: (data: CreatePedimentoData, companyId?: number) =>
		api.post<Pedimento>(`/v1/a76/pedimentos/?company_id=${companyId}`, data),

	/**
	 * Actualiza un pedimento existente
	 * @param id - ID del pedimento a actualizar
	 * @param data - Datos a actualizar
	 * @param companyId - ID de la compañía (por defecto 1)
	 */
	update: (id: number, data: UpdatePedimentoData, companyId?: number) =>
		api.put<Pedimento>(`/v1/a76/pedimentos/${id}/?company_id=${companyId}`, data),

	/**
	 * Elimina un pedimento
	 * @param id - ID del pedimento a eliminar
	 * @param companyId - ID de la compañía (por defecto 1)
	 */
	delete: (id: number, companyId?: number) => api.delete(`/v1/a76/pedimentos/${id}?company_id=${companyId}`)
};
