#include "arduino_secrets.h"
#include "thingProperties.h"
#include <Wire.h>
#include <Adafruit_SHT31.h>
#include <ArduinoGraphics.h>
#include <Arduino_LED_Matrix.h>

#define SHT31_I2C_ADDRESS 0x45
#define BUFLEN 100

Adafruit_SHT31 sht31 = Adafruit_SHT31();
ArduinoLEDMatrix matrix;

// 不快指数の計算
float calcDiscomfortIndex(float t, float h) {
  return 0.81 * t + 0.01 * h * (0.99 * t - 14.3) + 46.3;
}

// 不快指数の段階判定
char getDiscomfortSymbol(float di) {
  if (di < 60) return 'L';        // 寒い (Low)
  else if (di < 70) return 'C';   // 快適 (Comfort)
  else return 'H';                // 暑い (Hot)
}

// 1文字表示
void drawLetter(char ch) {
  matrix.beginDraw(); // 描画開始
  matrix.clear(); // 画面クリア
  matrix.stroke(1); // 描画色設定
  matrix.textFont(Font_5x7); // フォント設定
  matrix.text(String(ch), 4, 1); // 文字を表示
  matrix.endDraw(); // 描画終了
}

void setup() {
  Serial.begin(115200);
  while (!Serial) {}

  if (!sht31.begin(SHT31_I2C_ADDRESS)) {
    Serial.println("SHT31 not found");
    while (1) delay(1);
  }

  matrix.begin();

  initProperties();
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
}

void loop() {
  ArduinoCloud.update();

  float t = sht31.readTemperature();
  float h = sht31.readHumidity();

  if (!isnan(t) && !isnan(h)) {
    float discomfortIndex = calcDiscomfortIndex(temperature, humidity);

    // クラウド送信
    temperature = t;
    humidity = h;
    discomfort = calcDiscomfortIndex(temperature, humidity);

    // LEDマトリクス表示
    drawLetter(getDiscomfortSymbol(discomfortIndex));

    // シリアルプロッタ出力
    char buffer[BUFLEN];
    snprintf(buffer, sizeof(buffer), "温度:%.2f, 湿度:%.2f,不快指数:%.2f",
             temperature, humidity, discomfort);
    Serial.println(buffer);
  }

  delay(10000);
}