<?php

namespace AirQuality\Repositories;

/**
 * Fetches measurement readings from a MariaDB database.
 */
class MariaDBMeasurementDataRepository implements IMeasurementDataRepository {
	public static $table_name_metadata = "readings";
	public static $table_name_values = "reading_values";
	
	public static $column_values_id = "id";
	public static $column_values_reading_id = "reading_id";
	public static $column_values_value = "value";
	public static $column_values_reading_value_types_id = "reading_value_types_id";
	
	public static $column_metadata_id = "id";
	public static $column_metadata_storedon = "storedon";
	public static $column_metadata_recordedon = "recordedon";
	public static $column_metadata_device_id = "device_id";
	public static $column_metadata_lat = "reading_latitude";
	public static $column_metadata_long = "reading_longitude";
	
	// ------------------------------------------------------------------------
	
	/**
	 * The database connection.
	 * @var \AirQuality\Database
	 */
	private $database;
	
	function __construct(\AirQuality\Database $in_database) {
		$this->database = $in_database;
	}
	
	public function get_readings_by_date(\DateTime $datetime, string $reading_type) {
		return $this->database->query(
			"SELECT
				$this->table_name_values.*,
				$this->table_name_metadata.device_id,
				COALESCE(
					$this->table_name_metadata.$this->column_metadata_recordedon,
					$this->table_name_metadata.$this->column_metadata_storedon
				) AS datetime,
				COALESCE(
					$this->table_name_metadata.$this->column_metadata_lat,
					{MariaDBDeviceRepository::$table_name}.device_latitude
				) AS latitude,
				COALESCE(
					$this->table_name_metadata.$this->column_metadata_long,
					devices.device_longitude
				) AS longitude
			FROM $this->table_name_values
			JOIN $this->table_name_metadata ON $this->table_name_values.$this->column_values_reading_id = $this->table_name_metadata.id
			JOIN devices ON $this->table_name_metadata.$this->column_metadata_device_id = devices.device_id
			WHERE COALESCE(
				$this->table_name_metadata.$this->column_metadata_recordedon,
				$this->table_name_metadata.$this->column_metadata_storedon
			) = :datetime",
			[
				"datetime" => $datetime,
				"reading_type" => $reading_type
			]
		);
	}
}