package _VisualDVM.GlobalData.RemoteFile.UI;
import Common.Utils.Utils_;
import Common.Visual.UI;
import Common.Visual.Windows.Dialog.Dialog;
import _VisualDVM.Current;
import _VisualDVM.Global;
import _VisualDVM.GlobalData.RemoteFile.RemoteFile;
import _VisualDVM.Passes.SSH.ConnectionPass;
import com.jcraft.jsch.ChannelSftp.LsEntry;

import javax.swing.tree.DefaultMutableTreeNode;
import java.util.Collections;
import java.util.Comparator;
import java.util.Vector;
public class RemoteFileChooser extends Dialog<String, RemoteFileChooserFields> {
    public DefaultMutableTreeNode root = new DefaultMutableTreeNode("нет данных");
    ConnectionPass session;
    RemoteFile root_file;
    boolean target_is_directory = false;
    public RemoteFileChooser() {
        super(RemoteFileChooserFields.class);
    }
    @Override
    public boolean NeedsScroll() {
        return false;
    }
    @Override
    public void Init(Object... params) {
        session = (ConnectionPass) params[0];
        target_is_directory = (boolean) params[1];
        try {
            Refresh(session.user.connection.sftpChannel.pwd());
        } catch (Exception ex) {
            Utils_.MainLog.PrintException(ex);
            onCancel(); //закрываем окно.
        }
    }
    public void ShowCurrentRemoteFile() {
        fields.lCurrentFile.setText(Global.mainModule.getRemoteFile().full_name);
    }
    public void Refresh(String path) {
        try {
            Global.mainModule.set(Current.RemoteFile, null);//сброс текущего файла перед любым обновлением.
            fields.lCurrentFile.setText("?");
            //-------------------------------------------------------------------
            root_file = new RemoteFile(path, true);
            root = new DefaultMutableTreeNode(root_file);
            //-------------------------------------------------------
            Vector<LsEntry> files = session.user.connection.sftpChannel.ls(path);
            Vector<RemoteFile> directories_ = new Vector<>();
            Vector<RemoteFile> files_ = new Vector<>();
            //отсортировать по принадлежности.
            for (LsEntry file : files) {
                if (!file.getFilename().equals(".") && !file.getFilename().equals("")) {
                    if (file.getAttrs().isDir())
                        directories_.add(new RemoteFile(root_file.full_name, file.getFilename(), true));
                    else
                        files_.add(new RemoteFile(root_file.full_name, file.getFilename(), false));
                }
            }
            //отсортировать по алфавиту
            Collections.sort(directories_, Comparator.comparing(o -> o.name));
            Collections.sort(files_, Comparator.comparing(o -> o.name));
            for (RemoteFile f : directories_)
                root.add(new DefaultMutableTreeNode(f));
            for (RemoteFile f : files_)
                root.add(new DefaultMutableTreeNode(f));
            //просто пересоздаем дерево
            fields.treeForm.Show();
            fields.lCurrentFolder.setText(path);
        } catch (Exception ex) {
            Utils_.MainLog.PrintException(ex);
            onCancel();
        }
    }
    public void goHome() {
        try {
            Refresh(session.user.connection.sftpChannel.getHome());
        } catch (Exception ex) {
            Utils_.MainLog.PrintException(ex);
            onCancel(); //закрываем окно.
        }
    }
    public void goUp() {
        if (!root_file.full_name.equals("/")) {
            Refresh(root_file.parent);
        } else UI.Info("Корневая папка файловой системы достигнута.");
    }
    @Override
    public void validateFields() {
        String target_name = target_is_directory ? "папка" : "файл";
        if (Global.mainModule.HasRemoteFile()) {
            if (target_is_directory != Global.mainModule.getRemoteFile().isDirectory)
                Log.Writeln("Выбранный объект - не " + target_name);
        } else Log.Writeln(target_name + " не выбран(а)");
    }
}
