<?php
require_once __DIR__ . '/common.php';

$dbconn = getDBConnection();

//no gets, current point outage info
if(empty(array_diff_key($_GET, array('service' => '')))) {
    $result = pg_query_params($dbconn,
    "SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry',  ST_AsGeoJSON(realgeom)::json,'properties',json_build_object('time',startguess,'county',county,'state',state,'outage',outagen,'lastchange',lastchange,'cause',cause))order by startguess asc)) FROM power WHERE cwa = $1 and active = true",
    array('RLX')) or die('Query failed: ' . pg_last_error());
    $resultArray = pg_fetch_all($result);
    echo($resultArray[0]['json_build_object']);
}

//county/state max
if($_GET['max'] ?? null) {
    if($_GET['start'] ?? null) {
        $starttime = pg_escape_string($_GET['start']);
        if($_GET['end'] ?? null) {
            $endtime = pg_escape_string($_GET['end']);

            $result = pg_query_params($dbconn,
            "select distinct on (county,state) max(outage),county,state from (select distinct on (county,state,update) county,state,sum(outages) as outage, update as time, sum(served) as served from countyoutages where update > $2 and update < $3 and cwa = $1 group by county,state,update) as potato group by county,state",
            array('RLX',$starttime,$endtime)) or die('Query failed: ' . pg_last_error());

            $array = array();
            while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
                $array[] = $line;
            }
            echo json_encode($array);
        }
    }
}

if (isset($_GET['county'])) {
    try {
        $query = "
            SELECT DISTINCT ON (county, state)
                county,
                state,
                SUM(outages) as outage,
                update as time,
                SUM(served) as served,
                ROUND(
                    CAST(
                        CASE
                            WHEN SUM(served) = 0 THEN NULL
                            ELSE (SUM(outages)::FLOAT / SUM(served)) * 100
                        END AS NUMERIC
                    ), 2
                ) as perout
        FROM countyoutages
        WHERE update = (SELECT MAX(update) FROM countyoutages)
            AND (cwa = $1 OR cwa = $2 OR cwa = $3 OR cwa = $4 OR cwa = $5 OR cwa = $6 OR cwa = $7)
        GROUP BY county, state, update
        ";

        $result = pg_query_params($dbconn, $query, ['RLX','JKL','ILN','PBZ','MRX','LWX','RNK']);
        if ($result === false) {
            throw new Exception('Query failed: ' . pg_last_error());
        }

        $results = [];
        while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
            $results[] = $line;
        }

        header('Content-Type: application/json');
        echo json_encode($results);

        pg_free_result($result);
    } catch (Exception $e) {
        header('Content-Type: application/json');
        http_response_code(500);
        echo json_encode(['error' => 'Query execution failed: ' . $e->getMessage()]);
        exit;
    }
}

//county archive
if($_GET['countyarchive'] ?? null) {
    if($_GET['start'] ?? null) {
        $starttime = pg_escape_string($_GET['start']);
        if($_GET['end'] ?? null) {
            $endtime = pg_escape_string($_GET['end']);

            $result = pg_query_params($dbconn,
            "select distinct on (county,state,update) county,state,sum(outages) as outage, update as time, sum(served) as served from countyoutages where update > $9 and update < $10 and (cwa = $1 or cwa = $2 or cwa = $3 or cwa = $4 or cwa = $5 or cwa = $6 or cwa = $7 or cwa = $8) group by county,state,update",
            array('RLX','JKL','ILN','PBZ','MRX','LWX','RNK','CTP',$starttime,$endtime)) or die('Query failed: ' . pg_last_error());

            $array = array();
            while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
                $array[] = $line;
            }
            echo json_encode($array);
        }
    }
}

//Archive point data
if($_GET['archivepoint'] ?? null) {
    $starttime = pg_escape_string($_GET['start']);
    $endtime = pg_escape_string($_GET['end']);
    $result = pg_query_params($dbconn,
    "SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry',  ST_AsGeoJSON(realgeom)::json,'properties',json_build_object('time',startguess,'county',county,'state',state,'outage',outagen,'lastchange',lastchange,'cause',cause))order by startguess asc)) FROM power WHERE cwa = $1 and startguess > $2 and lastchange < $3",
    array('RLX',$starttime,$endtime)) or die('Query failed: ' . pg_last_error());
    $resultArray = pg_fetch_all($result);
    echo($resultArray[0]['json_build_object']);
}

// Svr related functionality
if($_GET['svr'] ?? null =='current') {
    $result = pg_query($dbconn,
    "SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry',  ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue < now() and endtime > now()") or die('Query failed: ' . pg_last_error());
    $resultArray = pg_fetch_all($result);
    echo($resultArray[0]['json_build_object']);
}

if($_GET['svr'] ?? null == 'archive') {
    if($_GET['start'] ?? null) {
        $starttime = pg_escape_string($_GET['start']);
        if($_GET['end'] ?? null) {
            $endtime = pg_escape_string($_GET['end']);

            $result = pg_query_params($dbconn,
            "SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry',  ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue > $1 and endtime < $2"
            ,array($starttime,$endtime)) or die('Query failed: ' . pg_last_error());
            $resultArray = pg_fetch_all($result);
            echo($resultArray[0]['json_build_object']);
        }
    }

    if(!isset($_GET['start']) && !isset($_GET['end'])) {
        $result = pg_query($dbconn,
        "SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry',  ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue < now() - interval '24 hours' and endtime > now() - interval '24 hours'") or die('Query failed: ' . pg_last_error());
        $resultArray = pg_fetch_all($result);
        echo($resultArray[0]['json_build_object']);
    }
}

pg_free_result($result);

// Close database connection when needed
if (isset($dbconn)) {
    pg_close($dbconn);
}
?>