/*
 * -------------------------------------------------------------------------
 * This file is part of the MindStudio project.
 * Copyright (c) 2025 Huawei Technologies Co.,Ltd.
 *
 * MindStudio is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * -------------------------------------------------------------------------
 */
import { request } from '@/centralServer/server';
import { ImportResultBody, LayerType, Project, ProjectDirectory, Response } from '@/centralServer/websocket/defs';
import { ClusterFile } from '@/entity/session';
import { ProjectAction } from '@/utils/enum';
import { ErrorMsg } from '@/centralServer/websocket/connection';
import { CompareData } from '@/utils/Compare';

export interface ImportProjectParams extends Record<string, unknown> {
    projectName: string;
    path: string[];
    selectedFileType?: LayerType;
    selectedFilePath?: string;
    selectedRankId?: string;
    projectAction: ProjectAction;
    isConflict: boolean;
}

export interface CardInfo {
    cardName: string;
    rankId: string;
    result: boolean;
    cardPath: string;
    host?: string;
    dataPathList: string[];
}

export interface ImportResult {
    reset: boolean;
    isPending: boolean;
    isSimulation: boolean;
    isIpynb: boolean;
    isCluster: boolean;
    result: CardInfo[];
}

/**
 * 获取文件路径下所有文件、文件夹
 * @returns ProjectDirectory[]
 */
export const getFiles = async (path = ''): Promise<unknown> => {
    return request('global', {
        command: 'files/get',
        params: { path },
    });
};

/**
 * 检查项目是否安全
 * @returns ProjectError
 */
export const checkProjectValid = async (params: {projectName: string;dataPath: string[]}): Promise<unknown> => {
    return request('global', {
        command: 'files/checkProjectValid',
        params,
    });
};

/**
 * 清理Timeline
 */
export const resetTimeline = async (): Promise<unknown> => {
    return request('timeline', { command: 'remote/reset' });
};

export const importProject = async (params: ImportProjectParams): Promise<Response<ImportResultBody> | ErrorMsg> => {
    return request<Response<ImportResultBody>>('timeline', {
        command: 'import/action',
        params,
    });
};

/**
 * 获取历史导入的文件
 * @returns ProjectDirectory[]
 */
export const getHistoryProject = async (): Promise<{projectDirectoryList: ProjectDirectory[]} | ErrorMsg> => {
    return request<{projectDirectoryList: ProjectDirectory[]}>('global', {
        command: 'files/getProjectExplorer',
        params: {},
    });
};

/**
 * 修改工程名
 */
export const updateProjectName = async (oldProjectName: string, newProjectName: string): Promise<unknown> => {
    return request('global', {
        command: 'files/updateProjectExplorer',
        params: { oldProjectName, newProjectName },
    });
};

/**
 *
 * 删除项目
 */
export const deleteProject = async (project: Project): Promise<unknown> => {
    return request('global', {
        command: 'files/deleteProjectExplorer',
        params: { projectName: project.projectName, dataPath: [] },
    });
};

export const clearProjects = async (projectNameList: React.Key[] = []): Promise<unknown> => {
    return request('global', {
        command: 'files/clearProjectExplorer',
        params: { projectNameList },
    });
};
/**
 * 移除文件
 */
export const deleteDataPath = async (project: { projectName: string; dataPath: string[] }): Promise<unknown> => {
    return request('global', {
        command: 'files/deleteProjectExplorer',
        params: { projectName: project.projectName, dataPath: project.dataPath },
    });
};

/**
 * 设置基线数据
 */
export const setBaseline = async (file: ClusterFile): Promise<Partial<CompareData & { errorMessage: string } & ErrorMsg>> => {
    return request<CompareData & { errorMessage: string }>('global', {
        command: 'global/setBaseline',
        params: { ...file },
    });
};

/**
 * 取消基线数据
 */
export const cancelBaseline = async (params: { projectName: string; filePath: string }): Promise<unknown> => {
    return request('global', {
        command: 'global/cancelBaseline',
        params,
    });
};

/**
 * 获取插件配置
 */
export const getModuleConfig = async (): Promise<unknown> => {
    return request('global', {
        command: 'moduleConfig/get',
        params: {},
    });
};