import type {
    SpawnOptions,
    SpawnSyncOptions,
    SpawnSyncReturns
} from 'child_process'
import crossSpawn from 'cross-spawn'
import { debug } from './utils/debug'

/**
 * 异步执行脚本
 *
 * @param client - 执行脚本的宿主,名称
 * @param argv - 参数
 * @param options - 透传配置
 * @returns result - 返回执行状态
 */
export function spawn(
    client: string,
    argv: string[],
    options: SpawnOptions = {}
): Partial<SpawnSyncReturns<string>> {
    let len = argv.length
    while (len--) {
        !argv[len] && argv.splice(len, 1)
    }
    const program = crossSpawn.sync(client, argv, {
        // stdio: 'inherit',
        shell: process.platform === 'win32',
        ...options
    })
    debug(client, argv)
    return {
        pid: program.pid,
        stdout: program.stdout
            ? program.stdout.toString().replace(/\s+$/, '')
            : '',
        stderr: program.stderr ? program.stderr.toString() : '',
        status: program.status,
        signal: program.signal,
        error: program.error
    }
}

/**
 * 同步执行脚本
 *
 * @param client - 执行脚本的宿主,名称
 * @param argv - 参数
 * @param options - 透传配置
 * @returns result - 返回执行状态
 */
export function spawnSync(
    client: string,
    argv: string[],
    options: SpawnSyncOptions = {}
): Partial<SpawnSyncReturns<string>> {
    let len = argv.length
    while (len--) {
        !argv[len] && argv.splice(len, 1)
    }
    const program = crossSpawn.sync(client, argv, {
        // stdio: 'inherit',
        shell: process.platform === 'win32',
        ...options
    })
    debug(client, argv)
    return {
        pid: program.pid,
        stdout: program.stdout
            ? program.stdout.toString().replace(/\s+$/, '')
            : '',
        stderr: program.stderr ? program.stderr.toString() : '',
        status: program.status,
        signal: program.signal,
        error: program.error
    }
}

export default {
    spawnSync,
    spawn
}