<?php
namespace EdgeManager\EDataCapture;

class ENodeConfigure {
    function __construct(
        protected $dbconn,
        protected $post = NULL,
        protected $get = NULL
    ) {}

    function add_node() {
        $exists = pg_query(sprintf(
            "SELECT EXISTS(
                SELECT 1 FROM hf_mes_scada_data_capture_node_configure WHERE code='%s'
            )", $this -> post['code']
        ));
        if (pg_fetch_assoc($exists)['exists'] == 't') {
            return "REPLICATED";
        }

        $table_name = "hf_mes_scada_data_capture_node_data_" . $this -> post['working_subclass'];

        pg_query($this -> dbconn, "BEGIN");
        $res[] = pg_query($this -> dbconn, sprintf(
            "CREATE TABLE IF NOT EXISTS %s (
                id serial8,
                code text references hf_mes_scada_data_capture_node_configure(code),
                v_string text,
                v_int int,
                v_float float8,
                v_bool bool,
                device_code text,
                batch text,
                capture_time timestamp NOT NULL DEFAULT NOW()
            )", $table_name
        ));
        $res[] = pg_insert(
            $this -> dbconn,
            'hf_mes_scada_data_capture_node_configure',
            $this -> post
        );
        // 检查一下，如果超表已经有了就不要尝试重复创建了
        $table_exists = pg_query(sprintf(
            "SELECT *
            FROM timescaledb_information.hypertables
            WHERE hypertable_name = '%s'
            ", $table_name
        ));
        if (!in_array($table_name, pg_fetch_all_columns($table_exists, 1))) {
            $res[] = pg_query($this -> dbconn, sprintf("SELECT create_hypertable('%s', 'capture_time')", $table_name));
            $res[] = pg_query($this -> dbconn, sprintf(
                "CREATE INDEX ON %s (v_string, v_int, v_float, v_bool, capture_time DESC)
                WHERE COALESCE(v_string, v_int::text, v_float::text, v_bool::text) IS NOT NULL
                ", $table_name
            ));
        }

        if (in_array(false, $res)) {
            pg_query($this -> dbconn, "ROLLBACK");
            return false;
        } else {
            pg_query($this -> dbconn, "COMMIT");
            return true;
        }
    }

    function remove_node() {
        pg_query($this -> dbconn, "BEGIN");
        $res[] = pg_delete(
            $this -> dbconn,
            'hf_mes_scada_data_capture_node_configure',
            $this -> post,
        );
        $exists = pg_query(sprintf(
            "SELECT EXISTS(
                SELECT 1 FROM hf_mes_scada_data_capture_node_configure WHERE code='%s'
            )", $this -> post['working_subclass']
        ));
        if (pg_fetch_assoc($exists)['exists'] == 'f') {
            $res[] = pg_query(sprintf(
                "DROP TABLE hf_mes_scada_data_capture_node_data_%s",
                $this -> post['working_subclass']
            ));
        }
        
        if (in_array(false, $res)) {
            pg_query($this -> dbconn, "ROLLBACK");
            return false;
        } else {
            pg_query($this -> dbconn, "COMMIT");
            return true;
        }
    }

    function update_node() {
        return pg_update(
            $this -> dbconn,
            'hf_mes_scada_data_capture_node_configure',
            $this -> post,
            ['code' => $this -> post['code']]
        );
    }

    function get_nodes() {
        $res = pg_query($this -> dbconn, "SELECT * FROM hf_mes_scada_data_capture_node_configure");
        return pg_fetch_all($res);
    }
}
