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

package org.jline.terminal.impl.ffm;

import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
import java.lang.foreign.MemoryLayout;
import org.jline.terminal.impl.PosixPtyTerminal;
import org.jline.terminal.Size;
import org.jline.terminal.Attributes;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.IOException;
import org.jline.terminal.spi.Pty;
import org.jline.terminal.impl.PosixSysTerminal;
import java.io.FileDescriptor;
import org.jline.utils.OSUtils;
import org.jline.terminal.spi.SystemStream;
import org.jline.terminal.Terminal;
import java.nio.charset.Charset;
import org.jline.terminal.spi.TerminalProvider;

public class FfmTerminalProvider implements TerminalProvider
{
    public FfmTerminalProvider() {
        if (!FfmTerminalProvider.class.getModule().isNativeAccessEnabled()) {
            throw new UnsupportedOperationException("Native access is not enabled for the current module: " + String.valueOf(FfmTerminalProvider.class.getModule()));
        }
    }
    
    @Override
    public String name() {
        return "ffm";
    }
    
    @Override
    public Terminal sysTerminal(final String name, final String type, final boolean ansiPassThrough, final Charset encoding, final Charset inputEncoding, final Charset outputEncoding, final boolean nativeSignals, final Terminal.SignalHandler signalHandler, final boolean paused, final SystemStream systemStream) throws IOException {
        if (OSUtils.IS_WINDOWS) {
            return NativeWinSysTerminal.createTerminal(this, systemStream, name, type, ansiPassThrough, encoding, inputEncoding, outputEncoding, nativeSignals, signalHandler, paused);
        }
        final Pty pty = new FfmNativePty(this, systemStream, -1, null, 0, FileDescriptor.in, (systemStream == SystemStream.Output) ? 1 : 2, (systemStream == SystemStream.Output) ? FileDescriptor.out : FileDescriptor.err, CLibrary.ttyName(0));
        return new PosixSysTerminal(name, type, pty, encoding, inputEncoding, outputEncoding, nativeSignals, signalHandler);
    }
    
    @Deprecated
    @Override
    public Terminal sysTerminal(final String name, final String type, final boolean ansiPassThrough, final Charset encoding, final Charset stdinEncoding, final Charset stdoutEncoding, final Charset stderrEncoding, final boolean nativeSignals, final Terminal.SignalHandler signalHandler, final boolean paused, final SystemStream systemStream) throws IOException {
        if (OSUtils.IS_WINDOWS) {
            final Charset outputEncoding = (systemStream == SystemStream.Error) ? stderrEncoding : stdoutEncoding;
            return NativeWinSysTerminal.createTerminal(this, systemStream, name, type, ansiPassThrough, encoding, stdinEncoding, outputEncoding, nativeSignals, signalHandler, paused);
        }
        final Pty pty = new FfmNativePty(this, systemStream, -1, null, 0, FileDescriptor.in, (systemStream == SystemStream.Output) ? 1 : 2, (systemStream == SystemStream.Output) ? FileDescriptor.out : FileDescriptor.err, CLibrary.ttyName(0));
        final Charset outputEncoding2 = (systemStream == SystemStream.Error) ? stderrEncoding : stdoutEncoding;
        return new PosixSysTerminal(name, type, pty, encoding, stdinEncoding, outputEncoding2, nativeSignals, signalHandler);
    }
    
    @Override
    public Terminal newTerminal(final String name, final String type, final InputStream in, final OutputStream out, final Charset encoding, final Charset inputEncoding, final Charset outputEncoding, final Terminal.SignalHandler signalHandler, final boolean paused, final Attributes attributes, final Size size) throws IOException {
        final Pty pty = CLibrary.openpty(this, attributes, size);
        return new PosixPtyTerminal(name, type, pty, in, out, encoding, inputEncoding, outputEncoding, signalHandler, paused);
    }
    
    @Deprecated
    @Override
    public Terminal newTerminal(final String name, final String type, final InputStream in, final OutputStream out, final Charset encoding, final Charset stdinEncoding, final Charset stdoutEncoding, final Charset stderrEncoding, final Terminal.SignalHandler signalHandler, final boolean paused, final Attributes attributes, final Size size) throws IOException {
        final Pty pty = CLibrary.openpty(this, attributes, size);
        return new PosixPtyTerminal(name, type, pty, in, out, encoding, stdinEncoding, stdoutEncoding, signalHandler, paused);
    }
    
    @Override
    public boolean isSystemStream(final SystemStream stream) {
        if (OSUtils.IS_WINDOWS) {
            return this.isWindowsSystemStream(stream);
        }
        return this.isPosixSystemStream(stream);
    }
    
    public boolean isWindowsSystemStream(final SystemStream stream) {
        return NativeWinSysTerminal.isWindowsSystemStream(stream);
    }
    
    public boolean isPosixSystemStream(final SystemStream stream) {
        return FfmNativePty.isPosixSystemStream(stream);
    }
    
    @Override
    public String systemStreamName(final SystemStream stream) {
        return FfmNativePty.posixSystemStreamName(stream);
    }
    
    @Override
    public int systemStreamWidth(final SystemStream stream) {
        return FfmNativePty.systemStreamWidth(stream);
    }
    
    @Override
    public String toString() {
        return "TerminalProvider[" + this.name();
    }
    
    static VarHandle lookupVarHandle(final MemoryLayout layout, final MemoryLayout.PathElement... element) {
        VarHandle h = layout.varHandle(element);
        h = MethodHandles.insertCoordinates(h, h.coordinateTypes().size() - 1, 0L);
        return h;
    }
}
