package com.demandware.studio.webdav;

import com.demandware.studio.projectWizard.DWModuleType;
import com.demandware.studio.settings.DWSettingsProvider;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.progress.PerformInBackgroundOption;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.vfs.newvfs.BulkFileListener;
import com.intellij.openapi.vfs.newvfs.events.VFileEvent;
import com.intellij.util.messages.MessageBusConnection;
import org.jetbrains.annotations.NotNull;

import java.util.List;

public class DWBulkFileListener implements ApplicationComponent, BulkFileListener {
    private MessageBusConnection connection;
    private static Logger LOG = Logger.getInstance(DWBulkFileListener.class);

    public DWBulkFileListener() {
        connection = ApplicationManager.getApplication().getMessageBus().connect();
    }

    public void initComponent() {
        connection.subscribe(VirtualFileManager.VFS_CHANGES, this);
    }

    public void disposeComponent() {
        connection.disconnect();
    }

    @NotNull
    public String getComponentName() {
        return "DWBulkFileListener";
    }

    @Override
    public void before(@NotNull List<? extends VFileEvent> events) {
    }

    @Override
    public void after(@NotNull List<? extends VFileEvent> events) {
        Project[] projects = ProjectManager.getInstance().getOpenProjects();

        for (VFileEvent event : events) {
            VirtualFile eventFile = event.getFile();

            if (eventFile != null && !eventFile.isDirectory()) {
                for (Project project : projects) {
                    Module module = ProjectRootManager.getInstance(project).getFileIndex().getModuleForFile(eventFile);

                    if (module != null) {
                        ModuleType CurrentModuleType = ModuleType.get(module);

                        // Bail out if auto uploads are not enabled.
                        if (!DWSettingsProvider.getInstance(module).getAutoUploadEnabled()) {
                            return;
                        }

                        if (CurrentModuleType instanceof DWModuleType) {
                            for (VirtualFile sourceRoot : ModuleRootManager.getInstance(module).getSourceRoots()) {
                                if (eventFile.getPath().contains(sourceRoot.getPath())) {
                                    ProgressManager.getInstance().run(
                                        new DWUpdateFileTask(
                                            project,
                                            module,
                                            "Syncing files to: " + DWSettingsProvider.getInstance(module).getHostname(),
                                            true,
                                            PerformInBackgroundOption.ALWAYS_BACKGROUND,
                                            sourceRoot.getPath(),
                                            eventFile.getPath()
                                        )
                                    );
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}