// 
// Decompiled by Procyon v0.6.0
// 

package org.jline.console;

import java.io.PrintStream;
import java.io.InputStream;
import org.jline.terminal.Terminal;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jline.reader.Candidate;
import org.jline.reader.impl.completer.SystemCompleter;

public interface CommandRegistry
{
    default SystemCompleter aggregateCompleters(final CommandRegistry... commandRegistries) {
        final SystemCompleter out = new SystemCompleter();
        for (final CommandRegistry r : commandRegistries) {
            out.add(r.compileCompleters());
        }
        return out;
    }
    
    default SystemCompleter compileCompleters(final CommandRegistry... commandRegistries) {
        final SystemCompleter out = aggregateCompleters(commandRegistries);
        out.compile(s -> createCandidate(commandRegistries, s));
        return out;
    }
    
    default Candidate createCandidate(final CommandRegistry[] commandRegistries, final String command) {
        String group = null;
        String desc = null;
        for (final CommandRegistry registry : commandRegistries) {
            if (registry.hasCommand(command)) {
                group = registry.name();
                desc = registry.commandInfo(command).stream().findFirst().orElse(null);
                break;
            }
        }
        return new Candidate(command, command, group, desc, null, null, true);
    }
    
    default String name() {
        return this.getClass().getSimpleName();
    }
    
    Set<String> commandNames();
    
    Map<String, String> commandAliases();
    
    List<String> commandInfo(final String p0);
    
    boolean hasCommand(final String p0);
    
    SystemCompleter compileCompleters();
    
    CmdDesc commandDescription(final List<String> p0);
    
    default Object invoke(final CommandSession session, final String command, final Object... args) throws Exception {
        throw new IllegalStateException("CommandRegistry method invoke(session, command, ... args) is not implemented!");
    }
    
    public static class CommandSession
    {
        private final Terminal terminal;
        private final InputStream in;
        private final PrintStream out;
        private final PrintStream err;
        
        public CommandSession() {
            this.in = System.in;
            this.out = System.out;
            this.err = System.err;
            this.terminal = null;
        }
        
        public CommandSession(final Terminal terminal) {
            this(terminal, terminal.input(), new PrintStream(terminal.output()), new PrintStream(terminal.output()));
        }
        
        public CommandSession(final Terminal terminal, final InputStream in, final PrintStream out, final PrintStream err) {
            this.terminal = terminal;
            this.in = in;
            this.out = out;
            this.err = err;
        }
        
        public Terminal terminal() {
            return this.terminal;
        }
        
        public InputStream in() {
            return this.in;
        }
        
        public PrintStream out() {
            return this.out;
        }
        
        public PrintStream err() {
            return this.err;
        }
    }
}
