import { useApp } from 'ink';
import { useState } from 'react';
import { CommandPicker } from './commandPicker.js';
import { GenerateCommand } from './generateCommand.js';
import { InitCommand } from './initCommand.js';

export type AppState =
    | { phase: 'select' }
    | { phase: 'generate'; configPath?: string; autoConfirm?: boolean }
    | { phase: 'init'; afterInit: 'generate' | 'exit' };

export interface AppProps {
    initial: AppState;
}

export function App(props: AppProps) {
    const [state, setState] = useState<AppState>(props.initial);
    const { exit } = useApp();

    if (state.phase === 'select') {
        return (
            <CommandPicker
                onPick={(cmd) => {
                    if (cmd === 'generate') {
                        setState({ phase: 'generate' });
                    } else {
                        setState({ phase: 'init', afterInit: 'exit' });
                    }
                }}
            />
        );
    }

    if (state.phase === 'generate') {
        return (
            <GenerateCommand
                configPath={state.configPath}
                autoConfirm={state.autoConfirm}
                onRequestInit={() => setState({ phase: 'init', afterInit: 'generate' })}
                onComplete={(failed) => {
                    process.exitCode = failed > 0 ? 1 : 0;
                    exit();
                }}
            />
        );
    }

    return (
        <InitCommand
            onComplete={(status) => {
                if (status === 'written' && state.afterInit === 'generate') {
                    setState({ phase: 'generate' });
                    return;
                }
                process.exitCode = status === 'aborted' ? 1 : 0;
                exit();
            }}
        />
    );
}
