#!/usr/bin/php
<?php
chdir(__DIR__);

$template_php = <<< EOT
---
document: modulemd
version: 2
data:
  name: php
  stream: remi-@VERSION@
  version: @DATE@
  context: 00000000
  arch: @ARCH@
  summary: PHP scripting language
  description: >-
    Alternative php @VERSION@ module.
    The remi-@VERSION@ stream provides more recent versions
    and more packages than default @VERSION@ stream.
  license:
    module:
    - GPLv2+
    content:
    - BSD
    - BSD and LGPLv3+
    - PHP
    - PHP and BSD
    - PHP and LGPLv2 and OpenLDAP
    - PHP and LGPLv2+
    - PHP and Zend and BSD and MIT and ASL 1.0
  dependencies:
  - buildrequires:
      platform: [@DIST@]
    requires:
@DEPS@
  references:
    documentation: http://php.net/
    tracker: https://bugs.php.net/
  profiles:
    common:
      rpms:
      - php-cli
      - php-common
      - php-fpm
      - php-json
      - php-mbstring
      - php-xml
    devel:
      rpms:
      - libzip
      - php-cli
      - php-common
      - php-devel
      - php-fpm
      - php-json
      - php-mbstring
      - php-pear
      - php-pecl-zip
      - php-process
      - php-xml
    minimal:
      rpms:
      - php-cli
      - php-common
  api:
    rpms:
    - php-fpm
  artifacts:
    rpms:

EOT;

$template_redis = <<< EOT
---
document: modulemd
version: 2
data:
  name: redis
  stream: remi-@VERSION@
  version: @DATE@
  context: 00000000
  arch: @ARCH@
  summary: Redis persistent key-value database
  description: >-
    Alternative redis @VERSION@ module.
    The remi-@VERSION@ stream provides more recent versions
    and than default @VERSION@ stream.
  license:
    module:
    - GPLv2+
    content:
    - BSD and MIT
    - CC-BY-SA
  dependencies:
  - buildrequires:
      platform: [@DIST@]
    requires:
@DEPS@
  references:
    documentation: https://redis.io/documentation
    tracker: https://github.com/antirez/redis/issues
  profiles:
    common:
      rpms:
      - redis
  api:
    rpms:
    - redis
  artifacts:
    rpms:

EOT;

$template_glpi = <<< EOT
---
document: modulemd
version: 2
data:
  name: glpi
  stream: @VERSION@
  version: @DATE@
  context: 00000000
  arch: @ARCH@
  summary: Free IT asset management software
  description: >-
    glpi @VERSION@ module
  license:
    module:
    - GPLv2+
    content:
    - GPLv2+ and GPLv3+ and MIT
  dependencies:
  - buildrequires:
      platform: [@DIST@]
    requires:
@DEPS@
  references:
    documentation: https://glpi-project.org/
    tracker: https://github.com/glpi-project/glpi/issues
  profiles:
    common:
      rpms:
      - glpi
  api:
    rpms:
    - glpi
  artifacts:
    rpms:

EOT;

$defaults = <<< EOT
---
document: modulemd-defaults
version: 1
data:
  module: php
  profiles:
    remi-7.2: [common]
    remi-7.3: [common]
...
---
document: modulemd-defaults
version: 1
data:
  module: glpi
  profiles:
    9.2: [common]
    9.3: [common]
    9.4: [common]
...
---
document: modulemd-defaults
version: 1
data:
  module: redis
  profiles:
    remi-5.0: [common]
...

EOT;

function findPackages($from, $dest, $pat) {
	$fil = '.';
	$rpms = [];
	foreach (glob("$from/$pat") as $file) {
		$info = rpminfo($file);
		$name = basename($file);
		if (!file_exists("$dest/$name")) {
			if (link($file, "$dest/$name")) {
				echo $fil;
				if (count($rpms)%64==63) {
					echo "\r";
					$fil = ($fil == '.' ? '-' : '.');
				}
			}
		}
		$rpms[] = 
			$info['Name'] . '-' . 
			($info['Epoch'] ?? '0') . ':' . 
			$info['Version'] . '-' . 
			$info['Release'] . '.' . 
			$info['Arch'];
	}
	echo "\r  " . count($rpms) . " rpms" . str_repeat(" ", 64) . "\n";
	return $rpms;
}

function genModule($srce, $dest, $pat, $ver, $arch, $deps, $template) {

	$rpms = findPackages($srce, $dest, $pat);
	$deptxt = '';
	foreach($deps as $n => $v) {
		$deptxt .= ($deptxt ? "\n" : '') . "      $n: [$v]";
	}
	$mod = str_replace(
		['@VERSION@', '@ARCH@', "@DATE@",       "@DIST@",         "@DEPS@"], 
		[$ver,        $arch,    date("YmdHis"), $deps['platform'], $deptxt], 
		$template
	);
	foreach($rpms as $rpm) {
		$mod .= "    - $rpm\n";
	}
	$mod .= "...\n";
	return $mod;
}

function cleanup($dest) {
	foreach (glob("$dest/*rpm") as $file) {
		unlink($file);
	}
}

function createRepo($dest, $mod) {
chdir($dest);

exec("mkrepo nocheck noclean");
$data = '/tmp/modules.yaml';
file_put_contents($data, $mod);
$hash = hash('sha256', $mod);
exec("modifyrepo_c --mdtype=modules $data repodata");
$arch = basename($dest);
rename($data, "$data.$arch");
echo "  in $data.$arch\n";

chdir(__DIR__);
}


if (count($_SERVER['argv'])<2 || in_array('f29', $_SERVER['argv'])) {
	$dest = 'fedora/29/modular/x86_64';
	echo "Populate $dest\n";
	cleanup($dest);
	$deps = ['platform' => 'f29'];
	$mod  = genModule('fedora/29/remi/x86_64',   $dest, 'php-*7.2*.rpm', '7.2', 'x86_64', $deps, $template_php);
	$mod .= genModule('fedora/29/php73/x86_64',  $dest, '*.rpm',         '7.3', 'x86_64', $deps, $template_php);
	$mod .= genModule('fedora/29/glpi92/x86_64', $dest, '*.rpm',         '9.2', 'x86_64', $deps, $template_glpi);
	$mod .= genModule('fedora/29/glpi93/x86_64', $dest, '*.rpm',         '9.3', 'x86_64', $deps, $template_glpi);
	$mod .= genModule('fedora/29/glpi94/x86_64', $dest, '*.rpm',         '9.4', 'x86_64', $deps, $template_glpi);
	$mod .= $defaults;
	createRepo($dest, $mod);

	$dest = 'fedora/29/modular-test/x86_64';
	echo "Populate $dest\n";
	cleanup($dest);
	$deps = ['platform' => 'f29'];
	$mod  = genModule('fedora/29/test/x86_64',   $dest, 'php-*7.2*.rpm', '7.2', 'x86_64', $deps, $template_php);
	$mod .= genModule('fedora/29/test73/x86_64', $dest, '*.rpm',         '7.3', 'x86_64', $deps, $template_php);
	$mod .= $defaults;
	createRepo($dest, $mod);

	$dest = 'fedora/29/modular/i386';
	echo "Populate $dest\n";
	cleanup($dest);
	$deps = ['platform' => 'f29'];
	$mod  = genModule('fedora/29/remi/i386',   $dest, 'php-*7.2*.rpm', '7.2', 'i386', $deps, $template_php);
	$mod .= genModule('fedora/29/php73/i386',  $dest, '*.rpm',         '7.3', 'i386', $deps, $template_php);
	$mod .= genModule('fedora/29/glpi92/i386', $dest, '*.rpm',         '9.2', 'i386', $deps, $template_glpi);
	$mod .= genModule('fedora/29/glpi93/i386', $dest, '*.rpm',         '9.3', 'i386', $deps, $template_glpi);
	$mod .= genModule('fedora/29/glpi94/i386', $dest, '*.rpm',         '9.4', 'i386', $deps, $template_glpi);
	$mod .= $defaults;
	createRepo($dest, $mod);

	$dest = 'fedora/29/modular-test/i386';
	echo "Populate $dest\n";
	cleanup($dest);
	$deps = ['platform' => 'f29'];
	$mod  = genModule('fedora/29/test/i386',   $dest, 'php-*7.2*.rpm', '7.2', 'i386', $deps, $template_php);
	$mod .= genModule('fedora/29/test73/i386', $dest, '*.rpm',         '7.3', 'i386', $deps, $template_php);
	$mod .= $defaults;
	createRepo($dest, $mod);
}

if (count($_SERVER['argv'])<2 || in_array('el8', $_SERVER['argv'])) {
	$dest = 'enterprise/8/modular-test/x86_64';
	echo "Populate $dest\n";
	cleanup($dest);
	$deps = ['platform' => 'el8', 'nginx' => '1.14', 'httpd' => '2.4'];
	$mod  = genModule('enterprise/8/test72/x86_64',  $dest, '*.rpm',         '7.2', 'x86_64', $deps, $template_php);
	$mod .= genModule('enterprise/8/test73/x86_64',  $dest, '*.rpm',         '7.3', 'x86_64', $deps, $template_php);
	$mod .= $defaults;
	createRepo($dest, $mod);

	$dest = 'enterprise/8/modular/x86_64';
	echo "Populate $dest\n";
	cleanup($dest);
	$deps = ['platform' => 'el8', 'nginx' => '1.14', 'httpd' => '2.4'];
	$mod  = genModule('enterprise/8/php72/x86_64',  $dest, '*.rpm',         '7.2', 'x86_64', $deps, $template_php);
	$mod .= genModule('enterprise/8/php73/x86_64',  $dest, '*.rpm',         '7.3', 'x86_64', $deps, $template_php);
	$mod .= genModule('enterprise/8/remi/x86_64',   $dest, 'redis*.rpm',    '5.0', 'x86_64', $deps, $template_redis);
	$deps = ['platform' => 'el8', 'php' => ''];
	$mod .= genModule('enterprise/8/glpi93/x86_64', $dest, '*.rpm',         '9.3', 'x86_64', $deps, $template_glpi);
	$mod .= genModule('enterprise/8/glpi94/x86_64', $dest, '*.rpm',         '9.4', 'x86_64', $deps, $template_glpi);
	$mod .= $defaults;
	createRepo($dest, $mod);
}