#!/usr/bin/env php
<?php

define('LATEST_RELEASE', '^4.7');
define('DEVELOP_BRANCH', 'dev-develop');
define('NEXT_MINOR', '^4.8-dev');
define('GITHUB_URL', 'https://github.com/codeigniter4/codeigniter4');

/*
 * --------------------------------------------------------------------
 * Stability Toggle
 * --------------------------------------------------------------------
 * Use this script to toggle the CodeIgniter dependency between the
 * latest stable release and the most recent development update.
 *
 * Usage: php builds [release|development|next]
 */

$branch = $argv[1] ?? '';

// Determine the requested stability
if ($branch === '' || ! in_array($branch, ['release', 'development', 'next'], true)) {
    echo 'Usage: php builds [release|development|next]' . PHP_EOL;

    exit;
}

$modified = [];

// Locate each file and update it for the requested stability

$file = __DIR__ . DIRECTORY_SEPARATOR . 'composer.json';

if (is_file($file)) {
    $contents = file_get_contents($file);

    if ((string) $contents !== '') {
        $array = json_decode($contents, true);

        if (is_array($array)) {
            if ($branch !== 'release') {
                $array['minimum-stability'] = 'dev';
                $array['prefer-stable']     = true;
                $array['repositories'] ??= [];

                $found = false;

                foreach ($array['repositories'] as $repository) {
                    if ($repository['url'] === GITHUB_URL) {
                        $found = true;
                        break;
                    }
                }

                if (! $found) {
                    $array['repositories'][] = [
                        'type' => 'vcs',
                        'url'  => GITHUB_URL,
                    ];
                }

                $array['require']['codeigniter4/codeigniter4'] = $branch === 'next' ? NEXT_MINOR : DEVELOP_BRANCH;
                unset($array['require']['codeigniter4/framework']);
            } else {
                unset($array['minimum-stability']);

                if (isset($array['repositories'])) {
                    foreach ($array['repositories'] as $i => $repository) {
                        if ($repository['url'] === GITHUB_URL) {
                            unset($array['repositories'][$i]);
                            break;
                        }
                    }

                    if ($array['repositories'] === []) {
                        unset($array['repositories']);
                    }
                }

                $array['require']['codeigniter4/framework'] = LATEST_RELEASE;
                unset($array['require']['codeigniter4/codeigniter4']);
            }

            file_put_contents($file, json_encode($array, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . PHP_EOL);

            $modified[] = $file;
        } else {
            echo 'Warning: Unable to decode composer.json! Skipping...' . PHP_EOL;
        }
    } else {
        echo 'Warning: Unable to read composer.json! Skipping...' . PHP_EOL;
    }
}

$files = [
    __DIR__ . DIRECTORY_SEPARATOR . 'app/Config/Paths.php',
    __DIR__ . DIRECTORY_SEPARATOR . 'phpunit.dist.xml',
    __DIR__ . DIRECTORY_SEPARATOR . 'phpunit.xml',
];

foreach ($files as $file) {
    if (is_file($file)) {
        $contents = file_get_contents($file);

        if ($branch !== 'release') {
            $contents = str_replace('vendor/codeigniter4/framework', 'vendor/codeigniter4/codeigniter4', $contents);
        } else {
            $contents = str_replace('vendor/codeigniter4/codeigniter4', 'vendor/codeigniter4/framework', $contents);
        }

        file_put_contents($file, $contents);

        $modified[] = $file;
    }
}

if ($modified === []) {
    echo 'No files modified.' . PHP_EOL;
} else {
    echo 'The following files were modified:' . PHP_EOL;

    foreach ($modified as $file) {
        echo " * {$file}" . PHP_EOL;
    }
}

echo 'Run `composer update` to sync changes with your vendor folder.' . PHP_EOL;
echo 'Don\'t forget to update the project files in app folder from "vendor/codeigniter4/*/app/".' . PHP_EOL;
