<?php

/**
 * User: sourcefabric
 * Date: 08/12/14.
 *
 * Class GeneralSetup
 *
 * Wrapper class for validating and setting up general settings during the installation process
 */
class GeneralSetup extends Setup
{
    // config file section header
    protected static $_section = '[general]';

    // Array of key->value pairs for the config file
    protected static $_properties;

    // Constant form field names for passing errors back to the front-end
    public const GENERAL_PORT = 'generalPort';
    public const GENERAL_HOST = 'generalHost';
    public const CORS_URL = 'corsUrl';

    public static $cors_url;

    // Message and error fields to return to the front-end
    public static $message;
    public static $errors = [];

    public function __construct($settings)
    {
        self::$_properties = [
            'api_key' => $this->generateRandomString(),
            'base_url' => $settings[self::GENERAL_HOST],
            'base_port' => $settings[self::GENERAL_PORT],
            'cors_url' => $settings[self::CORS_URL],
        ];
        self::$cors_url = $settings[self::CORS_URL];
    }

    /**
     * @return array associative array containing a display message and fields with errors
     */
    public function runSetup()
    {
        // TODO Do we need to validate these settings?

        if (count(self::$errors) <= 0) {
            $this->writeToTemp();
        }
        if (strlen(self::$cors_url) == 0) {
        } else {
            $this->setupCorsUrl();
        }

        return [
            'message' => self::$message,
            'errors' => self::$errors,
        ];
    }

    /**
     * If the user entered a CORS Url then add it to the system preferences
     * TODO Make sure we check for existing CORS URLs and display them on initial form.
     */
    public function setupCorsUrl()
    {
        try {
            $_SERVER['LIBRETIME_CONFIG_FILEPATH'] = INSTALLER_CONFIG_FILEPATH;
            Propel::init(PROPEL_CONFIG_FILEPATH);
            $con = Propel::getConnection();
        } catch (Exception $e) {
            self::$message = "Failed to insert Cors URL; database isn't configured properly!";
            self::$errors[] = self::CORS_URL;

            return;
        }

        $this->runCorsUrlQuery($con);
    }

    public function runCorsUrlQuery($con)
    {
        try {
            Application_Model_Preference::SetAllowedCorsUrls(self::$cors_url);
            Propel::close();
        } catch (Exception $e) {
            self::$message = 'Failed to insert ' . self::$cors_url . ' into cc_pref' . $e;
            self::$errors[] = self::CORS_URL;
        }
    }
}