<?php
set_time_limit(1);
ignore_user_abort(false); 

require '../conf/config.php';
require './common.php';

//From http request or command line

if (!isset($_SERVER["HTTP_HOST"])) {
    parse_str($argv[1], $_POST);
    foreach($_POST as $key => $val){
        $_POST[$key] = rtrim($val);
    }
    chdir($_POST['path']);
    set_time_limit(0);
}

(isset($_POST['prm_fa_chr']) && !empty($_POST['prm_fa_chr'])) ? $prm_chr=$_POST['prm_fa_chr']:returnError("Error");
(isset($_POST['prm_fa_s']) && !empty($_POST['prm_fa_s'])) ? $prm_s=$_POST['prm_fa_s']:returnError("Error");
(isset($_POST['prm_fa_e']) && !empty($_POST['prm_fa_e'])) ? $prm_e=$_POST['prm_fa_e']:returnError("Error");
//(isset($_POST['prm_fa_flk']) && !empty($_POST['prm_fa_flk'])) ? $prm_fa_flk=$_POST['prm_fa_flk']:returnError("Error");
(isset($_POST['prm_fa_tgt']) && !empty($_POST['prm_fa_tgt'])) ? $prm_tgt=$_POST['prm_fa_tgt']:returnError("Error");
(isset($_POST['prm_fa_var']) && !empty($_POST['prm_fa_var'])) ? $prm_var=$_POST['prm_fa_var']:$prm_var=".";
(isset($_POST['prm_fa_qual'])) ? $prm_qual=$_POST['prm_fa_qual']:returnError("Error");
(isset($_POST['prm_fa_dp'])) ? $prm_dp=$_POST['prm_fa_dp']:returnError("Error");
(isset($_POST['prm_fa_list']) && !empty($_POST['prm_fa_list'])) ? $prm_list=$_POST['prm_fa_list'] : returnError("Error");
(isset($_POST['prm_fa_name']) && !empty($_POST['prm_fa_name'])) ? $prm_name=$_POST['prm_fa_name'] : returnError("Error");
(isset($_POST['prm_fa_nameS']) && !empty($_POST['prm_fa_nameS'])) ? $prm_nameS=$_POST['prm_fa_nameS'] : returnError("Error");
(isset($_POST['prm_fa_ref']) && !empty($_POST['prm_fa_ref'])) ? $prm_ref=$_POST['prm_fa_ref'] : returnError("Error");
(isset($_POST['prm_fa_width'])) ? $prm_width=$_POST['prm_fa_width'] : returnError("Error");
(isset($_POST['prm_fa_p3prm'])) ? $prm_p3prm=$_POST['prm_fa_p3prm'] : returnError("Error");
(isset($_POST['prm_fa_avd'])) ? $prm_avd=$_POST['prm_fa_avd'] : returnError("Error");
(isset($_POST['prm_fa_Ns'])) ? $prm_Ns=$_POST['prm_fa_Ns'] : returnError("Error");
(isset($_POST['prm_fa_DN'])) ? $prm_DN=$_POST['prm_fa_DN'] : returnError("Error");
(isset($_POST['prm_fa_DNnum'])) ? $prm_DNnum=$_POST['prm_fa_DNnum'] : returnError("Error");
(isset($_POST['prm_type']) && !empty($_POST['prm_type'])) ? $prm_type=$_POST['prm_type'] : returnError("Error");
(isset($_POST['prm_epcrprms'])) ? $prm_epcrprms=$_POST['prm_epcrprms'] : returnError("Error");
(isset($_POST['prm_numthread'])) ? $prm_numthread=$_POST['prm_numthread'] : returnError("Error");
(isset($_POST['sid']) && !empty($_POST['sid'])) ? $sid=$_POST['sid'] : _stopError("Error");
$dir = __DIR__;

$php_flg=$_POST['prm_phpflg'];
if ($php_flg == 1) {
        $headurl = $_POST['prm_headurl'];
} else {
        $headers = apache_request_headers();

        foreach ($headers as $header => $value) {
            if($header == "Referer") {
                $headurl = $value;
            }
        }
}

$fpath = sprintf("%s/../tmp/%s.lock",$dir,$sid);
if (!file_exists($fpath)) {
        _stopError("Invalid connection");
}
//Varidate params
if($prm_type != "a" && $prm_type != "b" && $prm_type != "c"){
        error_log("Invalid value: type.\n");
        exit;
}
if ($php_flg != 1 && $php_flg != "") {
        error_log("Invalid value: php_flg.\n");
        exit;
}

$prm_DNnum=0;
$prm_DN=0;
if (!(ctype_digit($prm_tgt)) || !(is_numeric($prm_s)) || !(is_numeric($prm_e)) || !(is_numeric($prm_qual)) || !(is_numeric($prm_dp)) || !(is_numeric($prm_width)) || !(is_numeric($prm_avd)) || !(is_numeric($prm_Ns)) || !(is_numeric($prm_numthread)) || !(is_numeric($prm_DN)) || !(is_numeric($prm_DNnum))) {
        $errmsg = "<div align=\"center\"><font color=\"red\" style=\"font-size:18px;\">Invalid Value!!</font></di
v>";
        echo $errmsg;
        exit;
}

if ($php_flg == 1) {
        if(($prm_e - $prm_s) > 19999) {
                $errmsg = "<div align=\"center\"><font color=\"red\" style=\"font-size:18px;\">Invalid target length!!</font></div>";
                echo $errmsg;
                exit;
        }
} else if($php_flg == "") {
        if(($prm_e - $prm_s) > 199999) {
                $errmsg = "<div align=\"center\"><font color=\"red\" style=\"fon
t-size:18px;\">Invalid target length!!</font></div>";
                echo $errmsg;
                exit;
        }
}
_pregMatch($prm_name);
_pregMatch($prm_nameS);
_pregMatch($headurl);
_pregMatch($prm_list);
_pregMatch($prm_var);
_pregMatch($prm_p3prm);
_pregMatch($prm_epcrprms);
_pregMatch($prm_chr);

$params = "&prm_fa_chr=".$prm_chr."&prm_fa_s=".$prm_s."&prm_fa_e=".$prm_e."&prm_fa_tgt=".$prm_tgt."&prm_fa_flk=".$prm_fa_flk."&prm_fa_qual=".$prm_qual."&prm_fa_dp=".$prm_dp."&prm_fa_list=".$prm_list."&prm_fa_name=".$prm_name."&prm_fa_nameS=".$prm_nameS."&prm_fa_ref=".$prm_ref."&prm_fa_width=".$prm_width."&prm_fa_avd=".$prm_avd."&prm_fa_p3prm=&prm_fa_Ns=".$prm_Ns."&prm_fa_DN=".$prm_DN."&prm_type=".$prm_type."&prm_phpflg=".$php_flg."&prm_numthread=".$prm_numthread;

    $url_list = array();
    for ($i=0;$i<$prm_numthread;$i++) {
	$url = $headurl.'/bin/fasta.php.multi?pid='.$i.$params;
	array_push($url_list,$url);
    }
    //add dummy url
    array_push($url_list,'https://192.168.255.255/dummy.php');

    //実行
    $res = fetch_multi_url($url_list);
    echo json_encode($res);

/**
* 複数URLを同時に取得する
*
* @param array $url_list URLの配列
* @param int $timeout タイムアウト秒数 0だと無制限
* @return array 取得したソースコードの配列
*/
function fetch_multi_url($url_list,$timeout=0) {
    $mh = curl_multi_init();

    foreach ($url_list as $i => $url) {
        $conn[$i] = curl_init($url);
        curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);
        curl_setopt($conn[$i],CURLOPT_FAILONERROR,1);
        curl_setopt($conn[$i],CURLOPT_FOLLOWLOCATION,1);
        curl_setopt($conn[$i],CURLOPT_MAXREDIRS,3);

        //SSL証明書を無視
        curl_setopt($conn[$i],CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($conn[$i],CURLOPT_SSL_VERIFYHOST,false);

        //タイムアウト
        if ($timeout){
            curl_setopt($conn[$i],CURLOPT_TIMEOUT,$timeout);
        }

        curl_multi_add_handle($mh,$conn[$i]);
    }

    //URLを取得
    //すべて取得するまでループ
    $active = null;
    do {
        $mrc = curl_multi_exec($mh,$active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);

    while ($active and $mrc == CURLM_OK) {
        if (curl_multi_select($mh) != -1) {
            do {
                $mrc = curl_multi_exec($mh,$active);
            } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }

    if ($mrc != CURLM_OK) {
        echo '読み込みエラーが発生しました:'.$mrc;
    }

    //ソースコードを取得
    $res = array();
    foreach ($url_list as $i => $url) {
        if (($err = curl_error($conn[$i])) == '') {
            $res[$i] = curl_multi_getcontent($conn[$i]);
        } else {
            //echo '取得に失敗しました:'.$url_list[$i].'<br />';
        }
        curl_multi_remove_handle($mh,$conn[$i]);
        curl_close($conn[$i]);
    }
    curl_multi_close($mh);

    return $res;
}

function returnError($str){
    echo $str;
}
function _stopError($str){
    echo $str;
    exit;
}
