#include <iostream>
#include <vector>
#include <string>
#include <windows.h> // Для работы с функциями Windows API
#include <iomanip> // Для форматирования вывода
#include <ctime> // Для получения текущего времени

// Структура для хранения информации о сотруднике
struct Employee {
    std::string fullName;        // Полное имя
    int departmentNumber;        // Номер отдела
    std::string position;        // Должность
    int startYear;               // Год начала работы
};

// Функция для вычисления стажа работы в годах
int calculateYearsWorked(int startYear) {
    time_t t = time(nullptr); // Получаем текущее время в секундах
    tm* currentTime = localtime(&t); // Преобразуем в локальное время
    return (currentTime->tm_year + 1900) - startYear; // Вычисляем разницу между текущим годом и годом начала
}

// Функция для преобразования строки из UTF-8 в широкую строку (std::wstring)
std::wstring utf8_to_wstring(const std::string& str) {
    int size_needed = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), (int)str.size(), NULL, 0); // Подсчитываем необходимый размер буфера
    std::wstring wstr(size_needed, 0); // Создаем строку нужного размера
    MultiByteToWideChar(CP_UTF8, 0, str.c_str(), (int)str.size(), &wstr[0], size_needed); // Конвертируем строку
    return wstr;
}

// Функция для преобразования широкой строки (std::wstring) в UTF-8
std::string wstring_to_utf8(const std::wstring& wstr) {
    int size_needed = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), (int)wstr.size(), NULL, 0, NULL, NULL); // Подсчитываем необходимый размер буфера
    std::string str(size_needed, 0); // Создаем строку нужного размера
    WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), (int)wstr.size(), &str[0], size_needed, NULL, NULL); // Конвертируем строку
    return str;
}

// Функция для чтения данных сотрудников из текстового файла
std::vector<Employee> readFromFile(const std::string& filename) {
    std::vector<Employee> employees; // Вектор для хранения сотрудников

    // Открываем файл с помощью Windows API
    HANDLE hFile = CreateFileA(
        filename.c_str(),      // Имя файла
        GENERIC_READ,          // Режим чтения
        FILE_SHARE_READ,       // Общий доступ на чтение
        NULL,                  // Без дополнительных настроек безопасности
        OPEN_EXISTING,         // Открываем существующий файл
        FILE_ATTRIBUTE_NORMAL, // Обычные атрибуты файла
        NULL                   // Без шаблона
    );

    if (hFile == INVALID_HANDLE_VALUE) { // Если файл не удалось открыть
        std::cerr << "Error opening file!" << std::endl;
        return employees; // Возвращаем пустой список
    }

    char buffer[1024]; // Буфер для чтения из файла
    DWORD bytesRead; // Количество считанных байтов

    if (ReadFile(hFile, buffer, sizeof(buffer) - 1, &bytesRead, NULL)) { // Читаем содержимое файла в буфер
        buffer[bytesRead] = '\0'; // Добавляем нулевой символ в конец строки
        std::string fileContent(buffer); // Создаем строку из буфера

        std::wstring wideContent = utf8_to_wstring(fileContent); // Преобразуем из UTF-8 в широкую строку
        std::wstring::size_type pos = 0;

        // Разделяем строку на линии
        while ((pos = wideContent.find(L'\n')) != std::wstring::npos) {
            std::wstring line = wideContent.substr(0, pos); // Выделяем одну строку
            wideContent.erase(0, pos + 1); // Удаляем обработанную строку из исходного текста

            Employee emp; // Создаем структуру для нового сотрудника
            std::wstring::size_type delimPos = 0;

            // Извлекаем имя сотрудника
            delimPos = line.find(L'|');
            emp.fullName = wstring_to_utf8(line.substr(0, delimPos));
            line.erase(0, delimPos + 1);

            // Извлекаем номер отдела
            delimPos = line.find(L'|');
            emp.departmentNumber = std::stoi(line.substr(0, delimPos));
            line.erase(0, delimPos + 1);

            // Извлекаем должность сотрудника
            delimPos = line.find(L'|');
            emp.position = wstring_to_utf8(line.substr(0, delimPos));
            line.erase(0, delimPos + 1);

            // Извлекаем год начала работы
            emp.startYear = std::stoi(line);

            employees.push_back(emp); // Добавляем сотрудника в массив
        }
    } else {
        std::cerr << "Error reading file!" << std::endl; // Ошибка при чтении файла
    }

    CloseHandle(hFile); // Закрываем файл
    return employees; // Возвращаем список сотрудников
}

// Функция для фильтрации и вывода сотрудников из определенного отдела, проработавших более 20 лет
void filterEmployees(const std::vector<Employee>& employees, int departmentNumber) {
    std::cout << "List of employees from department " << departmentNumber << ", who have worked for more than 20 years:\n";
    std::cout << std::setw(20) << "Full Name" << std::setw(10) << "Dept" 
              << std::setw(20) << "Position" << std::setw(15) << "Experience" << "\n";
    std::cout << std::string(65, '-') << "\n";

    for (const auto& employee : employees) { // Перебираем всех сотрудников
        int yearsWorked = calculateYearsWorked(employee.startYear); // Вычисляем стаж
        if (employee.departmentNumber == departmentNumber && yearsWorked > 20) { // Фильтр: нужный отдел и стаж более 20 лет
            std::cout << std::setw(20) << employee.fullName
                      << std::setw(10) << employee.departmentNumber
                      << std::setw(20) << employee.position
                      << std::setw(15) << yearsWorked << "\n"; // Выводим информацию о сотруднике
        }
    }
}

int main() {
    // Устанавливаем кодировку консоли на UTF-8 для корректного вывода
    SetConsoleOutputCP(CP_UTF8);
    SetConsoleCP(CP_UTF8);

    std::string filename = "employees.txt"; // Имя файла с данными сотрудников

    std::vector<Employee> employees = readFromFile(filename); // Читаем данные сотрудников из файла

    if (employees.empty()) { // Если файл пустой или отсутствуют данные
        std::cerr << "No data found in the file." << std::endl;
        return 1; // Завершаем программу с ошибкой
    }

    int departmentNumber; // Переменная для номера отдела
    std::cout << "Enter the department number: "; // Запрос номера отдела у пользователя
    std::cin >> departmentNumber; // Чтение ввода от пользователя

    filterEmployees(employees, departmentNumber); // Фильтруем сотрудников и выводим их данные

    system("pause"); // Ждем нажатия клавиши для выхода
    return 0; // Успешное завершение программы
}Добавь код, чтобы в начале выводл весь список из txt