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

require __DIR__ . "/../../../autoload.php";

use Flagship\Decision\BucketingPolling;
use Flagship\Enum\FlagshipConstant;
use Flagship\Utils\HttpClient;

function startPolling($envId, $pollingInterval, $bucketingDirectory = null, $configFile = null)
{
    $bucketingPolling = new BucketingPolling($envId, $pollingInterval, new HttpClient(), $bucketingDirectory, $configFile);
    $bucketingPolling->startPolling();
}

function getParams()
{
    $fileArgument = getopt(null, ["config:"]);

    if (!empty($fileArgument['config'])) {
        $fileConfig = $fileArgument['config'];
    }

    if (!$fileConfig) {
        $fileConfig = 'flagship.json';
    }

    if (file_exists($fileConfig)) {
        return getFromConfigFile($fileConfig);
    }

    $configArray = getFromArgument();
    if ($configArray) {
        return $configArray;
    }
    fwrite(
        STDERR,
        "flagship config file not found" . PHP_EOL
    );
    return null;
}

function getFromArgument()
{
    $envId = getopt(null, ["envId:"]);
    if (!$envId) {
        fwrite(
            STDERR,
            "envId argument is required" . PHP_EOL
        );
        return null;
    }
    $configArray = [];
    $configArray['envId'] = $envId['envId'];

    $pollingInterval = getopt(null, ["pollingInterval:"]);

    if ($pollingInterval) {
        $configArray["pollingInterval"] = $pollingInterval["pollingInterval"];
    }
    else{
        $configArray['pollingInterval'] = FlagshipConstant::REQUEST_TIME_OUT * 1000;
        fwrite(
            STDERR,
            "pollingInterval field is missing, default value will be used 2000ms" . PHP_EOL
        );
    }

    if (!is_numeric($configArray["pollingInterval"])) {
        $configArray['pollingInterval'] = FlagshipConstant::REQUEST_TIME_OUT * 1000;
        fwrite(
            STDERR,
            "pollingInterval is not numeric, default value will be used 2000ms" . PHP_EOL
        );
    }

    $bucketingDirectoryPath = getopt(null, ["bucketingPath:"]);
    if ($bucketingDirectoryPath) {
        $configArray['bucketingPath'] = $bucketingDirectoryPath["bucketingPath"];
    }
    else{
        $configArray['bucketingPath'] = null;
        fwrite(
            STDERR,
            "bucketingDirectory field is missing default value will be used" . PHP_EOL
        );
    }

    return $configArray;
}

/**
 * @param $filePath
 * @return mixed|null
 */
function getFromConfigFile($filePath)
{
    $fileContent = file_get_contents($filePath);

    $configArray = json_decode($fileContent, true);

    if (!$configArray || !is_array($configArray)) {
        fwrite(
            STDERR,
            "flagship config malformed" . PHP_EOL
        );

        return null;
    }

    $configArray["fileConfigPath"] = $filePath;

    if (!isset($configArray['envId'])) {
        fwrite(
            STDERR,
            "envId field is missing" . PHP_EOL
        );
        return null;
    }

    if (!isset($configArray['pollingInterval'])) {

        $configArray['pollingInterval'] = FlagshipConstant::REQUEST_TIME_OUT * 1000;

        fwrite(
            STDERR,
            "pollingInterval field is missing, default value will be used 2000ms" . PHP_EOL
        );
    }

    if (!is_numeric($configArray['pollingInterval'])) {
        $configArray['pollingInterval'] = FlagshipConstant::REQUEST_TIME_OUT * 1000;
        fwrite(
            STDERR,
            "pollingInterval is not numeric, default value will be used 2000ms" . PHP_EOL
        );
    }


    if (!isset($configArray['bucketingPath'])) {
        $configArray['bucketingPath'] = null;
        fwrite(
            STDERR,
            "bucketingDirectory field is missing default value will be used" . PHP_EOL
        );
    }
    return $configArray;
}

$configArray = getParams();

if (!$configArray){
    die(1);
}
$envId = $configArray['envId'];
$bucketingDirectory = $configArray['bucketingPath'];
$pollingInterval = $configArray['pollingInterval'];

$fileConfig = null;

if (isset($configArray["fileConfigPath"])){
    $fileConfig = $configArray["fileConfigPath"];
}
startPolling($envId, $pollingInterval, $bucketingDirectory, $fileConfig);