#!/usr/bin/env php

<?php

/**

 * SCSSPHP

 *

 * @copyright 2012-2015 Leaf Corcoran

 *

 * @license http://opensource.org/licenses/MIT MIT

 *

 * @link http://leafo.github.io/scssphp

 */



error_reporting(E_ALL);



if (version_compare(PHP_VERSION, '5.4') < 0) {

    die('Requires PHP 5.4 or above');

}



include __DIR__ . '/../scss.inc.php';



use Leafo\ScssPhp\Compiler;

use Leafo\ScssPhp\Parser;

use Leafo\ScssPhp\Version;



$style = null;

$loadPaths = null;

$precision = null;

$dumpTree = false;

$inputFile = null;

$changeDir = false;

$debugInfo = false;

$lineNumbers = false;

$ignoreErrors = false;

$encoding = false;

$sourceMap = false;



/**

 * Parse argument

 *

 * @param integer $i

 * @param array $options

 *

 * @return string|null

 */

function parseArgument(&$i, $options) {

    global $argc;

    global $argv;



    if (! preg_match('/^(?:' . implode('|', (array) $options) . ')=?(.*)/', $argv[$i], $matches)) {

        return;

    }



    if (strlen($matches[1])) {

        return $matches[1];

    }



    if ($i + 1 < $argc) {

        $i++;



        return $argv[$i];

    }

}



for ($i = 1; $i < $argc; $i++) {

    if ($argv[$i] === '-h' || $argv[$i] === '--help') {

        $exe = $argv[0];



        $HELP = <<<EOT

Usage: $exe [options] [input-file]



Options include:



    -h, --help          Show this message

    --continue-on-error Continue compilation (as best as possible) when error encountered

    --debug-info        Annotate selectors with CSS referring to the source file and line number

    -f=format           Set the output format (compact, compressed, crunched, expanded, or nested)

    -i=path             Set import path

    --iso8859-1         Use iso8859-1 encoding instead of utf-8 (default utf-8)

    --line-numbers      Annotate selectors with comments referring to the source file and line number

    -p=precision        Set decimal number precision (default 10)

    --sourcemap         Create source map file

    -T                  Dump formatted parse tree

    -v, --version       Print the version



EOT;

        exit($HELP);

    }



    if ($argv[$i] === '-v' || $argv[$i] === '--version') {

        exit(Version::VERSION . "\n");

    }



    if ($argv[$i] === '--continue-on-error') {

        $ignoreErrors = true;

        continue;

    }



    if ($argv[$i] === '--debug-info') {

        $debugInfo = true;

        continue;

    }



    if ($argv[$i] === '--iso8859-1') {

        $encoding = 'iso8859-1';

        continue;

    }



    if ($argv[$i] === '--line-numbers' || $argv[$i] === '--line-comments') {

        $lineNumbers = true;

        continue;

    }



    if ($argv[$i] === '--sourcemap') {

        $sourceMap = true;

        continue;

    }



    if ($argv[$i] === '-T') {

        $dumpTree = true;

        continue;

    }



    $value = parseArgument($i, array('-f', '--style'));



    if (isset($value)) {

        $style = $value;

        continue;

    }



    $value = parseArgument($i, array('-i', '--load_paths'));



    if (isset($value)) {

        $loadPaths = $value;

        continue;

    }



    $value = parseArgument($i, array('-p', '--precision'));



    if (isset($value)) {

        $precision = $value;

        continue;

    }



    if (file_exists($argv[$i])) {

        $inputFile = $argv[$i];

        continue;

    }

}





if ($inputFile) {

    $data = file_get_contents($inputFile);



    $newWorkingDir = dirname(realpath($inputFile));

    $oldWorkingDir = getcwd();



    if ($oldWorkingDir !== $newWorkingDir) {

        $changeDir = chdir($newWorkingDir);

        $inputFile = basename($inputFile);

    }

} else {

    $data = '';



    while (! feof(STDIN)) {

        $data .= fread(STDIN, 8192);

    }

}



if ($dumpTree) {

    $parser = new Parser($inputFile);



    print_r(json_decode(json_encode($parser->parse($data)), true));



    exit();

}



$scss = new Compiler();



if ($debugInfo) {

    $scss->setLineNumberStyle(Compiler::DEBUG_INFO);

}



if ($lineNumbers) {

    $scss->setLineNumberStyle(Compiler::LINE_COMMENTS);

}



if ($ignoreErrors) {

    $scss->setIgnoreErrors($ignoreErrors);

}



if ($loadPaths) {

    $scss->setImportPaths(explode(PATH_SEPARATOR, $loadPaths));

}



if ($precision) {

    $scss->setNumberPrecision($precision);

}



if ($style) {

    $scss->setFormatter('Leafo\\ScssPhp\\Formatter\\' . ucfirst($style));

}



if ($sourceMap) {

    $scss->setSourceMap(Compiler::SOURCE_MAP_FILE);

}



if ($encoding) {

    $scss->setEncoding($encoding);

}



echo $scss->compile($data, $inputFile);



if ($changeDir) {

    chdir($oldWorkingDir);

}

