#!/usr/bin/env php
<?php
define('LATEST_RELEASE', '^4.0');
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]
 */

// Determine the requested stability
if (empty($argv[1]) || !in_array($argv[1], ['release', 'development'])) {
    echo 'Usage: php builds [release|development]' . PHP_EOL;
    exit();
}

$dev = $argv[1] == 'development';
$modified = [];

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

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

if (is_file($file)) {
    // Make sure we can read it
    if ($contents = file_get_contents($file)) {
        if ($array = json_decode($contents, true)) {
            // Development
            if ($dev) {
                // Set 'minimum-stability'
                $array['minimum-stability'] = 'dev';
                $array['prefer-stable'] = true;

                // Make sure the repo is configured
                if (!isset($array['repositories'])) {
                    $array['repositories'] = [];
                }

                // Check for the CodeIgniter repo
                $found = false;
                foreach ($array['repositories'] as $repository) {
                    if ($repository['url'] == GITHUB_URL) {
                        $found = true;
                        break;
                    }
                }

                // Add the repo if it was not found
                if (!$found) {
                    $array['repositories'][] = [
                        'type' => 'vcs',
                        'url' => GITHUB_URL,
                    ];
                }

                // Define the "require"
                $array['require']['codeigniter4/codeigniter4'] = 'dev-develop';
                unset($array['require']['codeigniter4/framework']);
            }

            // Release
            else {
                // Clear 'minimum-stability'
                unset($array['minimum-stability']);

                // If the repo is configured then clear it
                if (isset($array['repositories'])) {
                    // Check for the CodeIgniter repo
                    foreach ($array['repositories'] as $i => $repository) {
                        if ($repository['url'] == GITHUB_URL) {
                            unset($array['repositories'][$i]);
                            break;
                        }
                    }
                    if (empty($array['repositories'])) {
                        unset($array['repositories']);
                    }
                }

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

            // Write out a new composer.json
            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;
    }
}

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

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

        // Development
        if ($dev) {
            $contents = str_replace(
                'vendor/codeigniter4/framework',
                'vendor/codeigniter4/codeigniter4',
                $contents
            );
        }

        // Release
        else {
            $contents = str_replace(
                'vendor/codeigniter4/codeigniter4',
                'vendor/codeigniter4/framework',
                $contents
            );
        }

        file_put_contents($file, $contents);
        $modified[] = $file;
    }
}

if (empty($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;
}

