#include <windows.h>
#include <fstream>
#include <shlobj.h>
#include <string>
#include <codecvt>
#include <locale>

HWND hPassword1;
HWND hPassword2;

std::wstring passwordFilePath;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_CREATE:
    {
        // Создание окна ввода пароля
        hPassword1 = CreateWindow(TEXT("EDIT"), NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_PASSWORD,
            20, 20, 300, 40, hwnd, NULL, NULL, NULL);

        // Создание окна для подтверждения пароля
        hPassword2 = CreateWindow(TEXT("EDIT"), NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_PASSWORD,
            20, 80, 300, 40, hwnd, NULL, NULL, NULL);

        // Создание кнопки "Сохранить"
        CreateWindow(TEXT("BUTTON"), TEXT("Сохранить"), WS_VISIBLE | WS_CHILD,
            20, 140, 300, 40, hwnd, (HMENU)1, NULL, NULL);

        break;
    }
    case WM_COMMAND:
    {
        if (LOWORD(wParam) == 1) // Кнопка "Сохранить"
        {
            // Получение длины введенных символов первого пароля
            int length1 = GetWindowTextLengthW(hPassword1);

            // Получение длины введенных символов второго пароля
            int length2 = GetWindowTextLengthW(hPassword2);

            // Проверка на наличие пароля в полях
            if (length1 == 0 || length2 == 0)
            {
                MessageBox(hwnd, L"Введите пароль в оба поля!", L"Ошибка", MB_OK | MB_ICONERROR);
                if (length1 == 0)
                    SetFocus(hPassword1);
                else
                    SetFocus(hPassword2);
                return 0;
            }

            // Выделение памяти для строк паролей
            wchar_t* password1 = new wchar_t[length1 + 1];
            wchar_t* password2 = new wchar_t[length2 + 1];

            // Получение введенных паролей
            GetWindowTextW(hPassword1, password1, length1 + 1);
            GetWindowTextW(hPassword2, password2, length2 + 1);

            // Проверка на совпадение паролей
            if (wcscmp(password1, password2) != 0)
            {
                MessageBox(hwnd, L"Пароли не совпадают!", L"Ошибка", MB_OK | MB_ICONERROR);
                SetFocus(hPassword1);
                return 0;
            }

            // Получение пути к папке ProgramData
            wchar_t programDataPath[MAX_PATH];
            if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA, NULL, 0, programDataPath)))
            {
                // Создание полного пути до файла пароля
                std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
                passwordFilePath = std::wstring(programDataPath) + L"\logs.txt";

                // Сохранение пароля в файл
                std::ofstream outfile(passwordFilePath, std::ios::binary);
                if (outfile.is_open())
                {
                    outfile << converter.to_bytes(password2);
                    outfile.close();
                    MessageBox(hwnd, L"Пароль сохранен!", L"Успех", MB_OK | MB_ICONINFORMATION);
                }
                else
                {
                    MessageBox(hwnd, L"Не удалось создать файл!", L"Ошибка", MB_OK | MB_ICONERROR);
                }
            }
            else
            {
                MessageBox(hwnd, L"Не удалось получить путь к папке ProgramData!", L"Ошибка", MB_OK | MB_ICONERROR);
            }

            delete[] password1;
            delete[] password2;

            // Очистка полей ввода пароля
            SetWindowTextW(hPassword1, NULL);
            SetWindowTextW(hPassword2, NULL);
        }
        break;
    }
    case WM_PAINT:
    {
        // Рисование серого окошка
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
        HBRUSH hBrush = CreateSolidBrush(RGB(192, 192, 192)); // Серый цвет
        RECT rect;
        GetClientRect(hwnd, &rect);
        RoundRect(hdc, rect.left, rect.top, rect.right, rect.bottom, 10, 10); // Закругление краев
        FillRect(hdc, &rect, hBrush);
        EndPaint(hwnd, &ps);
        break;
    }
    case WM_CLOSE:
        // Закрытие окна при нажатии на "крестик"
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        // Выход из цикла обработки сообщений
        PostQuitMessage(0);
        break;
    default:
        // Обработка остальных сообщений
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }

    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow)
{
    // Регистрация класса окна
    const wchar_t CLASS_NAME[] = L"PasswordInputWindowClass";

    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);

    RegisterClass(&wc);

    // Создание окна
    HWND hwnd = CreateWindowEx(
        0, // Optional window styles
        CLASS_NAME, // Class name
        L"Введите пароль", // Window text
        WS_OVERLAPPEDWINDOW, // Window style

        // Position and size
        CW_USEDEFAULT, CW_USEDEFAULT, 340, 238,

        NULL, // Parent window
        NULL, // Menu
        hInstance, // Instance handle
        NULL // Additional application data
    );

    if (hwnd == NULL)
    {
        return 0;
    }

    // Отображение окна
    ShowWindow(hwnd, nCmdShow);

    // Запрос прав админа
    wchar_t szPath[MAX_PATH];
    if (GetModuleFileName(NULL, szPath, MAX_PATH))
    {
        SHELLEXECUTEINFO sei = { sizeof(sei) };
        sei.lpVerb = L"runas";
        sei.lpFile = szPath;
        sei.hwnd = hwnd;
        if (!ShellExecuteEx(&sei))
        {
            DWORD dwError = GetLastError();
            if (dwError == ERROR_CANCELLED)
            {
                MessageBox(hwnd, L"Приложение требует права администратора для работы.", L"Ошибка", MB_OK | MB_ICONERROR);
            }
        }
        else
        {
            // Завершение текущей копии приложения
            DestroyWindow(hwnd);
        }
    }
    else
    {
        MessageBox(hwnd, L"Не удалось получить путь к программе.", L"Ошибка", MB_OK | MB_ICONERROR);
    }

  
    
    // Обработка сообщений
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return static_cast<int>(msg.wParam);
}