<?php

namespace WP_Ultimo\Dependencies\Amp\WindowsRegistry;

use WP_Ultimo\Dependencies\Amp\ByteStream;
use WP_Ultimo\Dependencies\Amp\Process\Process;
use WP_Ultimo\Dependencies\Amp\Promise;
use function WP_Ultimo\Dependencies\Amp\call;
class WindowsRegistry
{
    public function read(string $key) : Promise
    {
        return call(function () use($key) {
            $key = \strtr($key, '/', "\\");
            $parts = \explode("\\", $key);
            $value = \array_pop($parts);
            $key = \implode("\\", $parts);
            $lines = (yield $this->query($key));
            $lines = \array_filter($lines, function ($line) {
                return '' !== $line && $line[0] === ' ';
            });
            $values = \array_map(function ($line) {
                return \preg_split("(\\s+)", \ltrim($line), 3);
            }, $lines);
            $foundValue = null;
            foreach ($values as $v) {
                if ($v[0] === $value) {
                    if (\count($v) >= 3) {
                        return $v[2];
                    }
                    $foundValue = $v;
                }
            }
            if ($foundValue) {
                throw new KeyNotFoundException("Windows registry key '{$key}\\{$value}' was found, but could not be read correctly, got " . \var_export($foundValue, \true));
            }
            throw new KeyNotFoundException("Windows registry key '{$key}\\{$value}' not found.");
        });
    }
    public function listKeys(string $key) : Promise
    {
        return call(function () use($key) {
            $lines = (yield $this->query($key));
            $lines = \array_filter($lines, function ($line) {
                return '' !== $line && $line[0] !== ' ';
            });
            return $lines;
        });
    }
    private function query(string $key) : Promise
    {
        return call(function () use($key) {
            if (0 !== \stripos(\PHP_OS, 'WIN')) {
                throw new \Error('Not running on Windows.');
            }
            $key = \strtr($key, '/', "\\");
            $cmd = \sprintf('reg query %s', \escapeshellarg($key));
            $process = new Process($cmd);
            (yield $process->start());
            $stdout = (yield ByteStream\buffer($process->getStdout()));
            $code = (yield $process->join());
            if ($code !== 0) {
                throw new KeyNotFoundException("Windows registry key '{$key}' not found.");
            }
            return \explode("\n", \str_replace("\r", '', $stdout));
        });
    }
}
