// 获取FS信息
void handleGetFSInfo() {
  FSInfo fs_info;
  if (!SPIFFS.info(fs_info)) {
    webServer.send(500, FPSTR(TEXT_PLAIN), "fs info error");
    return;
  }
  maxPathLength = fs_info.maxPathLength - 1;

  String json;
  json.reserve(1024);
  json = "{\"totalBytes\":";
  json += fs_info.totalBytes;
  json += ",\"usedBytes\":";
  json += fs_info.usedBytes;
  json += ",\"maxPathLength\":";
  json += maxPathLength;
  json += ",\"fList\":[";

  Serial.print("blockSize:");
  Serial.println(fs_info.blockSize);
  Serial.print("pageSize:");
  Serial.println(fs_info.pageSize);
  Serial.print("totalBytes:");
  Serial.println(fs_info.totalBytes);
  Serial.print("usedBytes:");
  Serial.println(fs_info.usedBytes);

  dir = SPIFFS.openDir("");
  bool isFirst = true;
  while (dir.next()) {
    if (isFirst) {
      isFirst = false;
    } else {
      json += ",";
    }
    json += "{\"fn\":\"";
    json += dir.fileName();
    json += "\",\"fs\":";
    json += dir.fileSize();
    json += "}";
  }
  json += "]}";
  webServer.send(200, APP_JSON, json);
}

// 上传文件
bool isError = false;
String fsSizeListStr = "";
int fsPointion = 0;
void handleFileUpload() {
  HTTPUpload& upload = webServer.upload();
  switch (upload.status) {
    case UPLOAD_FILE_START: {
        if (isError) {
          break;
        }
        String filename = upload.filename;
        fsPointion = filename.indexOf("/");
        if (fsPointion != -1) {
          filename =  filename.substring(fsPointion, filename.length());
        }
        if (filename.length() > maxPathLength) {
          replyServerError("路径长度不能大于" + String(maxPathLength) + "字节!");
          isError = true;
          return;
        }

        String fsSize;
        if (fsSizeListStr == "") {
          Serial.println(upload.name);
          fsSizeListStr = upload.name;
        }

        fsPointion = fsSizeListStr.indexOf(',');
        if (fsPointion == -1) {
          fsSize = fsSizeListStr;
        } else {
          fsSize = fsSizeListStr.substring(0, fsPointion);
          fsSizeListStr = fsSizeListStr.substring(fsPointion + 1, fsSizeListStr.length());
        }

        Serial.print(filename);
        Serial.print(" ");
        Serial.print(fsSize);
        Serial.println();

        file = SPIFFS.open(filename, "w");
        break;
      }
    case UPLOAD_FILE_WRITE: {
        if (!file || isError) {
          break;
        }
        uint32_t bytesWritten = file.write(upload.buf, upload.currentSize);
        if (bytesWritten != upload.currentSize) {
          isError = true;
          return replyServerError("写入失败!");
        }
        break;
      }
    case UPLOAD_FILE_END: {
        if (!file) {
          break;
        }
        file.close();
        break;
      }
  }
}

void handleFileUploadAfter() {
  isError = false;
  fsSizeListStr = "";
  webServer.send(200, FPSTR(TEXT_PLAIN), "上传成功!");
}

// 返回文件
void replyFile(String path) {
  String contentType = mime::getContentType(path);
  Serial.println(path + " - " + contentType);
  
  if (!SPIFFS.exists(path)) {
    if(path == getHomeUrl()) {
      webServer.sendHeader("Location", "http://" + webServer.client().localIP().toString() + "/admin", true);
      replyServerCode(307);
      return;
    }
    replyServerCode(204);
    return;
  }
  file = SPIFFS.open(path, "r");
  configSendHeader();
  if (webServer.streamFile(file, contentType) != file.size()) {
    replyServerNotFound(path);
  }
  file.close();
}

// 格式化fs
bool clearFS() {
  dir = SPIFFS.openDir("");
  while (dir.next()) {
    if (!SPIFFS.remove(dir.fileName())) {
      return false;
    }
  }
  return true;
//  SPIFFS.end();
//  bool isOk = SPIFFS.format();
//  if (!isOk) {
//    return false;
//  }
//  isOk = SPIFFS.begin();
//  return isOk;
}