//
// Created by AmirS on 25.04.2025.
//

#include "XmlParser.h"
#include <QFile>
#include <QXmlStreamReader>
#include <QDebug>

XmlParser::XmlParser(QObject *parent) : QObject(parent) {
}

QList<UiElement> XmlParser::parseUiDumpUsingQXml(const QString &filepath) {
    QFile file(filepath);
    QList<UiElement> elements;
    if (!file.open(QIODevice::ReadOnly)) {
        qDebug() << "Не удалось открыть XML файл:" << filepath;
        return elements;
    }

    QXmlStreamReader xmlReader(&file);

    while (!xmlReader.atEnd()) {
        xmlReader.readNext();

        if (xmlReader.hasError()) {
            qDebug() << "Ошибка парсинга XML в линии" << xmlReader.lineNumber() << ":"
                    << xmlReader.errorString();
            qCritical() << "Ошибка парсинга XML: " << xmlReader.errorString()
                    << ", далее вернем пустой элемент";
            return {}; // Возвращаем пустоту в случае ошибки
        }

        // Проверка на начало элемента
        if (xmlReader.isStartElement()) {
            if (xmlReader.name() == "node") {
                // Создаем элемент из текущего узла
                UiElement element = UiElement::fromXmlNode(xmlReader);
                elements.append(element);
            }
        }
    }

    if (xmlReader.hasError()) {
        qWarning() << "Ошибка парсинга XML в конце:" << xmlReader.errorString();
        qDebug() << "Ошибка парсинга XML в конце:" << xmlReader.errorString();
    }

    return elements;
}

bool XmlParser::isSecurityBanner(const QList<UiElement>& elements) {
    bool found = false;

    // Проверка на текст "Мы заботимся о вашей безопасности"
    for (const UiElement& el : elements) {
        if (el.text() == "Мы заботимся о вашей безопасности" && !el.text().isEmpty()) {
            found = true;
            break;
        }
    }

    // Если не нашли текст, ищем кнопку "Отложить"
    if (!found) {
        for (const UiElement& el : elements) {
            if (el.text() == "Отложить" && el.isClickable() && el.className() == "android.widget.Button") {
                found = true;
                break;
            }
        }
    }

    return found;
}

bool XmlParser::isPinCodeScreen(const QList<UiElement> &elements) {
    for (const UiElement &element: elements) {
        // Проверка на наличие текста для ввода PIN
        if (element.text().contains("Введите ПИН")) {
            return true;
        }
    }
    return false;
}

bool XmlParser::isBannerOrDialog(const QList<UiElement> &elements) {
    bool found = false;

    // 1. Проверка на наличие кнопок "Позже" и "Закрыть"
    for (const UiElement &element: elements) {
        // Проверка, что кнопка кликабельна и имеет текст "Позже" или "Закрыть"
        if (element.isClickable()) {
            if ((element.text() == "Позже" || element.text() == "Закрыть") &&
                element.className() == "android.widget.Button") {
                found = true;
                break;
            }
        }
    }

    // 2. Если не нашли "Позже" или "Закрыть", ищем кнопку без текста в правой верхней части экрана
    if (!found) {
        for (const UiElement &element: elements) {
            if (element.isClickable() && element.className() == "android.widget.Button" &&
                element.text().isEmpty()) {
                // Проверка, что кнопка в правой верхней части экрана
                // ~ Координаты в правом верхнем углу
                if (element.x1() > 800 && element.y1() < 200) {
                    found = true;
                    break;
                }
            }
        }
    }

    return found;
}

bool XmlParser::isMainScreen(const QList<UiElement> &elements) {
    for (const UiElement &element: elements) {
        // Проверка на кликабельную кнопку "Все продукты"
        if (element.text().contains("Все продукты") && element.isClickable()) {
            return true;
        }
    }
    return false;
}

bool XmlParser::isDetailCardScreen(const QList<UiElement> &elements) {
    bool isDetailCardScreen = false;

    // 1. Проверка на текст "Мои продукты"
    for (const UiElement &el: elements) {
        if (el.text().contains("Мои продукты") && !el.text().isEmpty()) {
            isDetailCardScreen = true;
            break;
        }
    }

    // 2. Если не нашли "Мои продукты", проверяем наличие кликабельной кнопки "Оплатить"
    if (!isDetailCardScreen) {
        for (const UiElement &el: elements) {
            if (el.text() == "Оплатить" && el.isClickable() && el.className() == "android.widget.Button") {
                // Кнопка "Оплатить" найдена и кликабельна
                isDetailCardScreen = true;
                break;
            }
        }
    }

    return isDetailCardScreen;
}
