import { state } from '../state/index.js';

/**
 * API Configuration
 * Centralized configuration for all model types and their endpoints
 */

// Model type definitions
export const MODEL_TYPES = {
    LORA: 'loras',
    CHECKPOINT: 'checkpoints',
    EMBEDDING: 'embeddings' // Future model type
};

// Base API configuration for each model type
export const MODEL_CONFIG = {
    [MODEL_TYPES.LORA]: {
        displayName: 'LoRA',
        singularName: 'lora',
        defaultPageSize: 100,
        supportsLetterFilter: true,
        supportsBulkOperations: true,
        supportsMove: true,
        templateName: 'loras.html'
    },
    [MODEL_TYPES.CHECKPOINT]: {
        displayName: 'Checkpoint',
        singularName: 'checkpoint',
        defaultPageSize: 100,
        supportsLetterFilter: false,
        supportsBulkOperations: true,
        supportsMove: true,
        templateName: 'checkpoints.html'
    },
    [MODEL_TYPES.EMBEDDING]: {
        displayName: 'Embedding',
        singularName: 'embedding',
        defaultPageSize: 100,
        supportsLetterFilter: true,
        supportsBulkOperations: true,
        supportsMove: true,
        templateName: 'embeddings.html'
    }
};

/**
 * Generate API endpoints for a given model type
 * @param {string} modelType - The model type (e.g., 'loras', 'checkpoints')
 * @returns {Object} Object containing all API endpoints for the model type
 */
export function getApiEndpoints(modelType) {
    return {
        // Base CRUD operations
        list: `/api/lm/${modelType}/list`,
        excluded: `/api/lm/${modelType}/excluded`,
        delete: `/api/lm/${modelType}/delete`,
        exclude: `/api/lm/${modelType}/exclude`,
        unexclude: `/api/lm/${modelType}/unexclude`,
        rename: `/api/lm/${modelType}/rename`,
        save: `/api/lm/${modelType}/save-metadata`,
        cancelTask: `/api/lm/${modelType}/cancel-task`,

        // Bulk operations
        bulkDelete: `/api/lm/${modelType}/bulk-delete`,

        // Tag operations
        addTags: `/api/lm/${modelType}/add-tags`,

        // Move operations (now common for all model types that support move)
        moveModel: `/api/lm/${modelType}/move_model`,
        moveBulk: `/api/lm/${modelType}/move_models_bulk`,

        // CivitAI integration
        fetchCivitai: `/api/lm/${modelType}/fetch-civitai`,
        fetchAllCivitai: `/api/lm/${modelType}/fetch-all-civitai`,
        relinkCivitai: `/api/lm/${modelType}/relink-civitai`,
        civitaiVersions: `/api/lm/${modelType}/civitai/versions`,
        refreshUpdates: `/api/lm/${modelType}/updates/refresh`,
        fetchMissingLicenses: `/api/lm/${modelType}/updates/fetch-missing-license`,
        modelUpdateStatus: `/api/lm/${modelType}/updates/status`,
        modelUpdateVersions: `/api/lm/${modelType}/updates/versions`,
        ignoreModelUpdate: `/api/lm/${modelType}/updates/ignore`,
        ignoreVersionUpdate: `/api/lm/${modelType}/updates/ignore-version`,

        // Preview management
        replacePreview: `/api/lm/${modelType}/replace-preview`,
        setPreviewFromUrl: `/api/lm/${modelType}/set-preview-from-url`,

        // Query operations
        scan: `/api/lm/${modelType}/scan`,
        topTags: `/api/lm/${modelType}/top-tags`,
        searchTags: `/api/lm/${modelType}/search-tags`,
        baseModels: `/api/lm/${modelType}/base-models`,
        roots: `/api/lm/${modelType}/roots`,
        folders: `/api/lm/${modelType}/folders`,
        folderTree: `/api/lm/${modelType}/folder-tree`,
        unifiedFolderTree: `/api/lm/${modelType}/unified-folder-tree`,
        duplicates: `/api/lm/${modelType}/find-duplicates`,
        conflicts: `/api/lm/${modelType}/find-filename-conflicts`,
        verify: `/api/lm/${modelType}/verify-duplicates`,
        metadata: `/api/lm/${modelType}/metadata`,
        modelDescription: `/api/lm/${modelType}/model-description`,

        // Auto-organize operations
        autoOrganize: `/api/lm/${modelType}/auto-organize`,
        autoOrganizeProgress: `/api/lm/${modelType}/auto-organize-progress`,

        // Model-specific endpoints (will be merged with specific configs)
        specific: {}
    };
}

/**
 * Model-specific endpoint configurations
 */
export const MODEL_SPECIFIC_ENDPOINTS = {
    [MODEL_TYPES.LORA]: {
        letterCounts: `/api/lm/${MODEL_TYPES.LORA}/letter-counts`,
        notes: `/api/lm/${MODEL_TYPES.LORA}/get-notes`,
        triggerWords: `/api/lm/${MODEL_TYPES.LORA}/get-trigger-words`,
        previewUrl: `/api/lm/${MODEL_TYPES.LORA}/preview-url`,
        civitaiUrl: `/api/lm/${MODEL_TYPES.LORA}/civitai-url`,
        metadata: `/api/lm/${MODEL_TYPES.LORA}/metadata`,
        getTriggerWordsPost: `/api/lm/${MODEL_TYPES.LORA}/get_trigger_words`,
        civitaiModelByVersion: `/api/lm/${MODEL_TYPES.LORA}/civitai/model/version`,
        civitaiModelByHash: `/api/lm/${MODEL_TYPES.LORA}/civitai/model/hash`,
    },
    [MODEL_TYPES.CHECKPOINT]: {
        info: `/api/lm/${MODEL_TYPES.CHECKPOINT}/info`,
        checkpoints_roots: `/api/lm/${MODEL_TYPES.CHECKPOINT}/checkpoints_roots`,
        unet_roots: `/api/lm/${MODEL_TYPES.CHECKPOINT}/unet_roots`,
        metadata: `/api/lm/${MODEL_TYPES.CHECKPOINT}/metadata`,
    },
    [MODEL_TYPES.EMBEDDING]: {
        metadata: `/api/lm/${MODEL_TYPES.EMBEDDING}/metadata`,
    }
};

/**
 * Get complete API configuration for a model type
 * @param {string} modelType - The model type
 * @returns {Object} Complete API configuration
 */
export function getCompleteApiConfig(modelType) {
    const baseEndpoints = getApiEndpoints(modelType);
    const specificEndpoints = MODEL_SPECIFIC_ENDPOINTS[modelType] || {};
    const config = MODEL_CONFIG[modelType];

    return {
        modelType,
        config,
        endpoints: {
            ...baseEndpoints,
            specific: specificEndpoints
        }
    };
}

/**
 * Validate if a model type is supported
 * @param {string} modelType - The model type to validate
 * @returns {boolean} True if valid, false otherwise
 */
export function isValidModelType(modelType) {
    return Object.values(MODEL_TYPES).includes(modelType);
}

/**
 * Get model type from current page or explicit parameter
 * @param {string} [explicitType] - Explicitly provided model type
 * @returns {string} The model type
 */
export function getCurrentModelType(explicitType = null) {
    if (explicitType && isValidModelType(explicitType)) {
        return explicitType;
    }

    return state.currentPageType || MODEL_TYPES.LORA;
}

// Download API endpoints (shared across all model types)
export const DOWNLOAD_ENDPOINTS = {
    download: '/api/lm/download-model',
    downloadGet: '/api/lm/download-model-get',
    cancelGet: '/api/lm/cancel-download-get',
    progress: '/api/lm/download-progress',
    exampleImages: '/api/lm/force-download-example-images', // Re-process example images ignoring previous status
    exampleImagesMissing: '/api/lm/download-example-images' // Download only missing example images
};

// Hugging Face API endpoints
export const HF_ENDPOINTS = {
    repoFiles: '/api/lm/hf-repo-files',
    download: '/api/lm/download-hf-model',
};

// WebSocket endpoints
export const WS_ENDPOINTS = {
    fetchProgress: '/ws/fetch-progress'
};
