<?xml version="1.0" encoding="UTF-8"?>
<project name="Elastica" default="build" basedir=".">

    <property name="source" value="${basedir}/lib"/>

    <target name="parallelTasks">
        <parallel threadCount="2">
            <sequential>
                <antcall target="pdepend"/>
                <antcall target="phpmd-ci"/>
                <antcall target="phpcb"/>
            </sequential>
            <antcall target="phpcpd"/>
            <antcall target="phpcs-ci"/>
            <antcall target="phpdoc-ci"/>
        </parallel>
    </target>

    <target name="clean" description="Cleanup build artifacts">
        <delete dir="${basedir}/build/api"/>
        <delete dir="${basedir}/build/code-browser"/>
        <delete dir="${basedir}/build/coverage"/>
        <delete dir="${basedir}/build/logs"/>
        <delete dir="${basedir}/build/pdepend"/>
        <delete dir="${basedir}/build/docs"/>
        <delete file="${basedir}/cache.properties"/>
    </target>

    <target name="prepare" depends="clean" description="Prepare for build">
        <mkdir dir="${basedir}/build/api"/>
        <mkdir dir="${basedir}/build/code-browser"/>
        <mkdir dir="${basedir}/build/coverage"/>
        <mkdir dir="${basedir}/build/logs"/>
        <mkdir dir="${basedir}/build/docs"/>
        <mkdir dir="${basedir}/build/pdepend"/>
    </target>

    <target name="install" description="installs and starts elasticsearch">
        <exec executable="bash">
            <arg value="-c" />
            <arg value="curl -sS https://getcomposer.org/installer | php" />
        </exec>
        <exec executable="php">
            <arg value="composer.phar" />
            <arg value="self-update" />
        </exec>
        <exec executable="php">
            <arg value="composer.phar" />
            <arg value="--dev" />
            <arg value="install" />
        </exec>
        <exec executable="bash">
            <env key="ES_VER" value="1.3.0"/>
            <env key="ES_MAPPER_ATTACHMENTS_VER" value="1.6.0"/>
            <env key="ES_TRANSPORT_THRIFT_VER" value="1.4.0"/>
            <arg value="test/bin/run_elasticsearch.sh"/>
        </exec>
    </target>

    <target name="composer" depends="prepare" description="Install dependencies">
        <exec executable="composer">
            <arg value="--dev"></arg>
            <arg value="install"></arg>
        </exec>
    </target>

    <target name="lint">
        <apply executable="php" failonerror="true">
            <arg value="-lf"/>

            <fileset dir="${source}">
                <include name="**/*.php"/>
                <modified/>
            </fileset>

            <fileset dir="${basedir}/test">
                <include name="**/*.php"/>
                <modified/>
            </fileset>
        </apply>
    </target>

    <target name="phpunit" depends="composer">
        <exec executable="phpunit" dir="${basedir}/test" failonerror="off" />
    </target>

    <!-- Generate jdepend.xml and software metrics charts -->
    <target name="pdepend">
        <exec executable="pdepend">
            <arg value="--jdepend-xml=${basedir}/build/logs/jdepend.xml" />
            <arg value="--jdepend-chart=${basedir}/build/pdepend/dependencies.svg" />
            <arg value="--overview-pyramid=${basedir}/build/pdepend/overview-pyramid.svg" />
            <arg path="${source}" />
        </exec>
    </target>

    <target name="phpmd-ci">
        <exec executable="phpmd">
            <arg path="${source}" />
            <arg value="xml" />
            <arg value="codesize,unusedcode,naming,design" />
            <arg value="--reportfile" />
            <arg value="${basedir}/build/logs/pmd.xml" />
        </exec>
    </target>

    <!-- Generate pmd-cpd.xml -->
    <target name="phpcpd">
        <exec executable="phpcpd">
            <arg line="--log-pmd ${basedir}/build/logs/pmd-cpd.xml ${source}" />
        </exec>
    </target>

    <!-- Generate checkstyle.xml -->
    <target name="phpcs-ci">
        <exec executable="phpcs" output="/dev/null">
            <arg line="--report=checkstyle --report-file=${basedir}/build/logs/checkstyle.xml --standard=PSR2 ${source}" />
        </exec>
    </target>

    <target name="phploc" description="Generate phploc.csv">
        <exec executable="phploc">
        <arg value="--log-csv" />
        <arg value="${basedir}/build/logs/phploc.csv" />
        <arg path="${source}" />
        </exec>
    </target>

    <!-- Generate API documentation -->
    <target name="phpdoc">
        <exec executable="phpdoc">
            <arg line="run" />
            <arg line="-d lib/" />
            <arg line="-t build/docs" />
        </exec>
    </target>

    <target name="phpdoc-ci">
        <exec executable="phpdoc">
            <arg line="run" />
            <arg line="-d lib/" />
            <arg line="-t build/docs" />
            <arg line="-q" />
        </exec>
    </target>

    <target name="phpcb">
        <exec executable="phpcb">
            <arg line="--log ${basedir}/build/logs
                    --source ${source}
                    --output ${basedir}/build/code-browser" />
        </exec>
    </target>

    <target name="build" depends="prepare,composer,lint,parallelTasks,phpunit"/>

    <!-- Checkstyle with human output -->
    <target name="phpcs">
        <exec executable="phpcs">
            <arg line="--standard=PSR2 ${source}" />
        </exec>
    </target>

    <target name="phpmd" description="Perform phpmd with human readable output">
        <exec executable="phpmd">
            <arg path="${source}"/>
            <arg value="text"/>
            <arg value="codesize,unusedcode,naming,design" />
            <arg value="${basedir}/build/phpmd.xml"/>
        </exec>
    </target>

    <!-- Setups test environment -->
    <target name="setup" description="setups php libs for">
        <exec executable="pear">
            <arg line="channel-discover pear.pdepend.org" />
        </exec>
        <exec executable="pear">
            <arg line="channel-discover pear.phpmd.org" />
        </exec>
        <exec executable="pear">
            <arg line="channel-discover pear.phpunit.de" />
        </exec>
        <exec executable="pear">
            <arg line="channel-discover components.ez.no" />
        </exec>
        <exec executable="pear">
            <arg line="channel-discover pear.symfony-project.com" />
        </exec>
        <exec executable="pear">
            <arg line="channel-discover pear.michelf.com" />
        </exec>
        <exec executable="pear">
            <arg line="channel-discover pear.phpdoc.org" />
        </exec>

        <exec executable="pear">
            <arg line="install pdepend/PHP_Depend" />
        </exec>
        <exec executable="pear">
            <arg line="install phpmd/PHP_PMD" />
        </exec>
        <exec executable="pear">
            <arg line="install phpunit/phpcpd" />
        </exec>
        <exec executable="pear">
            <arg line="install phpunit/phploc" />
        </exec>
        <exec executable="pear">
            <arg line="install phpdoc/phpDocumentor-alpha" />
        </exec>
        <exec executable="pear">
            <arg line="install PHP_CodeSniffer" />
        </exec>
        <exec executable="pear">
            <arg line="install --alldeps phpunit/PHP_CodeBrowser" />
        </exec>
        <exec executable="pear">
            <arg line="install --alldeps phpunit/PHPUnit" />
        </exec>
    </target>

    <target name="gource" description="Visualize repos with gource">
        <exec executable="gource">
            <arg line="--log-format git" />
            <arg line="--seconds-per-day 0.1" />
            <arg line="--title 'Elastica (https://github.com/ruflin/Elastica)'" />
            <arg line="--user-scale 1" />
            <arg line="--max-user-speed 50" />
        </exec>
    </target>
</project>
