#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C LCD(0x27, 16, 2); // 根据实际 I2C 地址和引脚数量初始化 LCD

const char* ssid = "Wokwi-GUEST";    // WiFi 名称
const char* password = "";            // WiFi 密码,Wokwi-GUEST 网络无需密码
const char* ntpServer = "pool.ntp.org"; // NTP 服务器

const int BUTTON_PIN = 5; // 按钮连接到 GPIO 5

// 凯撒密码加密函数
String caesarEncrypt(String text, int shift) {
    String encryptedText = "";
    for (char c : text) {
        if (isalpha(c)) {
            char base = islower(c)? 'a' : 'A';
            encryptedText += (char)(((c - base + shift) % 26) + base);
        } else {
            encryptedText += c;
        }
    }
    return encryptedText;
}

// 凯撒密码解密函数
String caesarDecrypt(String encryptedText, int shift) {
    return caesarEncrypt(encryptedText, 26 - shift);
}

void setup() {
    Serial.begin(115200);
    LCD.init(); // 初始化 LCD
    LCD.backlight();

    pinMode(BUTTON_PIN, INPUT_PULLUP); // 设置 BUTTON_PIN 为输入并启用内部上拉电阻

    // 显示连接到 WiFi 的过程
    LCD.setCursor(0, 0);
    LCD.print("Connecting to ");
    LCD.setCursor(0, 1);
    LCD.print("WiFi ");

    // WiFi 连接代码
    WiFi.begin(ssid, password);
    while (WiFi.status()!= WL_CONNECTED) {
        delay(500);
        LCD.print(".");
    }

    Serial.println("WiFi connected");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());

    // 更新 LCD 显示
    LCD.clear();
    LCD.setCursor(0, 0);
    LCD.print("Online");
    LCD.setCursor(0, 1);
    LCD.print("Press Button");
}

void loop() {
    static const char* originalDocument = "shanyuqi"; // 替换为需要加密的原始文档
    static bool buttonPressed = false; // 用于跟踪按钮按下的状态

    if (!buttonPressed && digitalRead(BUTTON_PIN) == LOW) { // 检测按钮是否被按下
        buttonPressed = true; // 更新按钮状态
        delay(200); // 简单的消抖
    }

    if (buttonPressed) {
        LCD.clear();
        LCD.setCursor(0, 0);
        LCD.print("Original: ");
        LCD.print(originalDocument);

        int shift = 3; // 加密移位数
        String encryptedText = caesarEncrypt(originalDocument, shift);

        LCD.setCursor(0, 1);
        LCD.print("Encrypted: ");
        LCD.print(encryptedText);
    } else {
        // 显示等待按钮按下的信息
        LCD.setCursor(0, 1);
        LCD.print("to Show Encryption");
    }
}