#include <Arduino.h>
#include <SPI.h>
#include <SdFat.h>

// =======================
// SD Card pins (SPI2)
// =======================
#define SD_CS   PB12
#define SD_SCK  PB13
#define SD_MISO PB14
#define SD_MOSI PB15

// LEDs
#define LED_WORK PC13
#define LED_OK   PB4
#define LED_ERR  PB3

// =======================
// Objects
// =======================
SPIClass SPI_2(2);   // SPI2 hardware
SdFat SD;            // SdFat filesystem object

void setup() {
  pinMode(LED_WORK, OUTPUT);
  pinMode(LED_OK, OUTPUT);
  pinMode(LED_ERR, OUTPUT);

  digitalWrite(LED_WORK, LOW);
  digitalWrite(LED_OK, LOW);
  digitalWrite(LED_ERR, LOW);

  Serial.begin(115200);
  delay(500);
  Serial.println("\n=== STM32 SD Card Test via SPI2 (SdFat v2) ===");

  // Blink to show test in progress
  for (int i = 0; i < 5; i++) {
    digitalWrite(LED_WORK, HIGH);
    delay(100);
    digitalWrite(LED_WORK, LOW);
    delay(100);
  }

  // Configure SPI2 pins
  SPI_2.setMOSI(SD_MOSI);
  SPI_2.setMISO(SD_MISO);
  SPI_2.setSCLK(SD_SCK);
  SPI_2.begin();

  // --- NEW METHOD for SdFat v2 ---
  SdSpiConfig spiConfig(SD_CS, DEDICATED_SPI, SD_SCK_MHZ(18), &SPI_2);

  Serial.println("🔹 Initializing SD card on SPI2...");
  if (!SD.begin(spiConfig)) {
    Serial.println("❌ SD initialization failed!");
    Serial.println("Check wiring (PB12–PB15), 3.3V power, and FAT32 format.");
    digitalWrite(LED_ERR, HIGH);
    return;
  }

  Serial.println("✅ SD card initialized successfully!");

  // Get card info
  uint32_t sectors = SD.card()->sectorCount();
  Serial.print("SD Card Size: ");
  Serial.print((float)sectors * 512 / 1024 / 1024, 2);
  Serial.println(" MB");

  // --- Write test ---
  File testFile = SD.open("test.txt", FILE_WRITE);
  if (testFile) {
    testFile.println("STM32 SD SPI2 write test OK!");
    testFile.close();
    Serial.println("✅ test.txt written successfully!");
  } else {
    Serial.println("❌ Failed to create file!");
    digitalWrite(LED_ERR, HIGH);
    return;
  }

  // --- Read back test ---
  testFile = SD.open("test.txt");
  if (testFile) {
    Serial.println("📄 File content:");
    while (testFile.available()) {
      Serial.write(testFile.read());
    }
    testFile.close();
    Serial.println("\n✅ File read successful!");
    digitalWrite(LED_OK, HIGH);
  } else {
    Serial.println("❌ File read failed!");
    digitalWrite(LED_ERR, HIGH);
  }
}

void loop() {
  digitalWrite(LED_WORK, !digitalRead(LED_WORK));
  delay(300);
}
