<?php
// extract a subset of a bedfile
// todo: check auth
session_start();
require_once 'util.function.php';
if(!$_SESSION['researcher_id'] || !bedfile_access_permission($_SESSION['researcher_id'], $_GET['bed_ids'])) {
    exit;
}

require_once 'db.function.php';
require_once 'const.inc.php';

//$_GET['bed_ids'] = array(226);
//$_GET['experiment_id'] = 1;
//$_GET['chrom'] = 'chr1';
//$_GET['start'] = '';
//$_GET['end'] = '';
//$_GET['rgb'] = 'N,N,N';

$db = getDB();
$metadata = array();
if($_GET['rgb'] == 'N,N,N') { // || !preg_match("/^\d+,\d+,\d+$/") {
    $_GET['rgb'] = '';
}
$err = '';

if($_GET['split']) {
}

foreach($_GET['bed_ids'] as $bed_id) {            // foreach here but for now it's only ever just one bed_id
    $r1 = $db->getRow("select filetype, name, header from bedfile where bedfile_id = ?", array($bed_id));
    $new['name'] = "Extract of $r1[name]";
    $new['descr'] = "Extracted from $r1[name]. Chromosome: " . ($_GET['chrom'] ? $_GET['chrom'] : 'Any') . " Start: " . ($_GET['start'] ? $_GET['start'] : 0) .
                    " End: " . ($_GET['end'] ? $_GET['end'] : 'Any') . " RGB: " . ($_GET['rgb'] ? $_GET['rgb'] : 'Any');
    $stat = $db->query("insert into bedfile (name, upload_date, header, experiment_id, descr) values (?,?,?,?,?)", $elts = array($new['name'], $date = date('Y-m-d H:i:s'), $r1['header'], $_GET['experiment_id'], $new['descr']));
    //print_r($elts);
    //if(PEAR::isError($stat)) {
    //    print_r($stat);
    //}
    $output_bed_id = $db->getOne("select last_insert_id()");
    //print "$output_bed_id\n";
    if($r1['filetype'] == 'rawbed') {
        $fp = fopen($db->getOne("select filepath from rawbed where bedfile_id = ?", $bed_id), "r");
        $output_path = FILE_REPOSITORY_PATH . "/" . uniqid() . date('YmdHis');
        $outputfp = fopen($output_path, "w");
        $have_data = false;
        while($r = fgetcsv($fp, 0, "\t")) {
            if(stripos($r[0], 'chr') !== 0) {
                fputs($outputfp, "$r[0]\n");
                continue;
            }
            if((!$_GET['chrom'] || $_GET['chrom'] == $r[0]) && (!$_GET['start'] || $r[1] >= $_GET['start'] ) && (!$_GET['end'] || $r[2] <= $_GET['end'])
                && (!$_GET['rgb'] || $_GET['rgb'] == trim($r[8], "\"'"))) {
                //emit line
                fputs($outputfp, trim(join("\t", $r)) . "\n");
                $have_data = true;
            }
        }
        fclose($fp);
        fclose($outputfp);
        if($have_data) {
            $db->query('update bedfile set filetype = ? where bedfile_id = ?', array('rawbed', $output_bed_id));
            $db->query('insert into rawbed (bedfile_id, filepath) values (?,?)', array($output_bed_id, $output_path));
            $db->commit();
            $metadata[] = array('name' => $new['name'], 'header' => (string)$r1['header'], 'upload_date' => date('n/j/y', strtotime($date)), 'id' => $output_bed_id, 'genome' => '', 'method' => '', 'descr' => (string)$new['descr']);
        } else {
            // todo: error: extract generated nothing!
            unlink($output_path);
            $err = "It looks like the extraction yielded no output for your chosen file.";
        }
    } else {
        $vals = array();
        if($_GET['chrom']) {
            $fields[] = 'chrom';
            $vals[] = $_GET['chrom'];
            $ops[] = '=';
        }
        if($_GET['start']) {
            $fields[] = 'chromstart';
            $vals[] = $_GET['start'];
            $ops[] = '>=';
        }
        if($_GET['end']) {
            $fields[] = 'chromend';
            $vals[] = $_GET['end'];
            $ops[] = '<=';
        }
        if($_GET['rgb']) {
            $fields[] = 'itemrgb';
            $vals[] = $_GET['rgb'];
            $ops[] = '=';
        }
        $whr = array();
        for($j = 0; isset($vals[$j]); $j++) {
            $whr[] = "$fields[$j] $ops[$j] ?";
        }
        $whr_cl = "where bedfile_id = $bed_id";
        if(count($whr)) {
            $whr_cl .= ' AND ' . join(' AND ', $whr);
        }
        $tbl_info = $db->tableInfo('summarybed');
        $field_arr = array();
        foreach($tbl_info as $f) {
            if($f['name'] != 'summarybed_id' && $f['name'] != 'bedfile_id') {
                $field_arr[] = $f['name'];
            }
        }
        $ifields = join(',', $field_arr);
        //$q = "insert into summarybed (bedfile_id,$ifields) select $output_bed_id as bedfile_id, $ifields from summarybed $whr_cl";
        //$q = "select $output_bed_id as bedfile_id, $ifields from summarybed $whr_cl";
        $q = "select $ifields from summarybed $whr_cl";
        file_put_contents("/tmp/dasrextr.log", "$q\n\n". print_r($vals, true));
        $result = $db->query($q, $vals);
        //if($db->getOne("select summarybed_id from summarybed where bedfile_id = ? limit 1", $output_bed_id)) {
        //$qmarks = join(',', array_fill(0, count($field_arr) + 1, '?'));
        if($result->numRows()) {
            $output_path = FILE_REPOSITORY_PATH . '/' . uniqid() . date('YmdHis');
            $fp = fopen($output_path, "w");
            fputs($fp, $r1['header'] . " (extract)\n");
            while($r = $result->fetchRow()) {
                fputs($fp, join("\t", $r) . "\n");
                //$stat = $db->query("insert into summarybed (bedfile_id,$ifields) values ($qmarks)", $r);
                //if(PEAR::isError($stat)) {
                //    file_put_contents("/tmp/dasrextr.log", print_r($stat, true), FILE_APPEND);
                //    die('insert failed');
                //}
                //if($i % 10 == 0) {
                //    $db->commit();
                //}
            }
            fclose($fp);
            $db->query('update bedfile set filetype = ? where bedfile_id = ?', array('rawbed', $output_bed_id));
            $db->query('insert into rawbed (bedfile_id, filepath) values (?,?)', array($output_bed_id, $output_path));
            $db->commit();
            $metadata[] = array('name' => $new['name'], 'header' => (string)$r1['header'], 'upload_date' => date('n/j/y', strtotime($date)), 'id' => $output_bed_id, 'genome' => '', 'method' => '', 'descr' => (string)$new['descr']);
        } else {
            //todo: generate error: extract yielded nothing
            file_put_contents("/tmp/dasrextr.log", "\nno result...\n", FILE_APPEND);
            $err = "It looks like the extraction yielded no output for your chosen file.";
        }
    }
}
print json_encode(array("err" => $err, "filelist" => $metadata));
