import { v4 as uuidv4 } from 'uuid';
import { test, expect } from '@playwright/test';
import constants from '../../../../constants';

import { PropertyElement, Navigator, Graph, LoginPage, SymbolPanel, ContextMenu, Header } from '../../../../DSL/allClasses';

test('K.1.6.1.18. Переход по ссылкам вокруг связи', async ({ page }) => {
    /*
    https://confluence.silaunion.ru/pages/viewpage.action?pageId=2428871107
    */

    const dataBaseName: string = 'K.1.6.1.18_' + uuidv4();
    const modelName: string = uuidv4();
    const edgeName: string = ' [Edges with attributes]';
    const firstLocaleModelName: object = { enName: "Test 1", ruName: "Тест 1" };
    const secondLocaleModelName: object = { enName: "Test 2", ruName: "Тест 2" };
    const elementProperty = new PropertyElement(page);
    const navigator = new Navigator(page);
    const graph = new Graph(page);
    const loginPage = new LoginPage(page);
    const symbolPanel = new SymbolPanel(page);
    const contextMenu = new ContextMenu(page);
    const header = new Header(page);
    const attributesToAdd: = ['test_attribute', 'select123456789', 'date', 'node', 'datatime', 'text', 'mselect123456789', 'number', 'period', 'json', 'link', 'string', 'times', 'boolean'];
    const attributesLocaleValue:object = {
        link: { ruName: "ruLink", enName: 'enLink', ruLink: "www.ya.ru", enLink: "www.google.com" },
        text: { ruName: 'ruText', enName: 'enText' },
        string: { ruName: 'ruString', enName: 'enString' },
        selection: { ruName: 'РУ11', enName: 'EN11' },
        mselection: { ruName: ['РУ21', 'РУ22', 'РУ23'], enName: ['EN21', 'EN22', 'EN23'] },
    };
    await page.goto('/');
    // Условие:
    await loginPage.signIn({});
    // Создать БД
    await contextMenu.createBD(dataBaseName);
    // Создать модель
    await contextMenu.createModel(modelName, dataBaseName);
    // Перенести 2 объекта на холст и провести связь между ними
    await navigator.openSymbolPanel();
    const positionFirstObject = { x: 210, y: 200 };
    const positionSecondObject = { x: 710, y: 220 };
    const positionEdge = {
        x: positionFirstObject.x + 190, y: positionFirstObject.y + 40
    };
    await symbolPanel.dragSymbolToGraph(constants.TEST_METHODOLOGY_SYMBOL_OWAS, positionFirstObject.x, positionFirstObject.y);
    await symbolPanel.dragSymbolToGraph(constants.TEST_METHODOLOGY_SYMBOL_TO, positionSecondObject.x, positionSecondObject.y);
    await graph.createEdgeBetweenElements(positionFirstObject.x, positionFirstObject.y, positionSecondObject.x, positionSecondObject.y);
    // Отрыть дерево созданной БД
    await navigator.clickOnItemMenu(dataBaseName);
    // Создать модель с именем "Тест 1" для русской локализации и "Test 1" для английской локализации
    await contextMenu.createModel(firstLocaleModelName.ruName, dataBaseName);
    await navigator.clickOnItemMenu(firstLocaleModelName.ruName, { button: 'right' });
    await contextMenu.clickProperties();
    await elementProperty.editAttributeStr('', 'Имя модели', firstLocaleModelName);
    await elementProperty.clickSaveButton();
    // Создать модель с именем "Тест 2" для русской локализации и "Test 2" для английской локализации
    await contextMenu.createModel(secondLocaleModelName.ruName, dataBaseName);
    await navigator.clickOnItemMenu(secondLocaleModelName.ruName, { button: 'right' });
    await contextMenu.clickProperties();
    await elementProperty.editAttributeStr('', 'Имя модели', secondLocaleModelName);
    await elementProperty.clickSaveButton();

    await test.step('1.Создание определения связи', async () => {
        // Возвращаемся на вкладку со связью
        await graph.openTab(modelName);
        await graph.createEdgeDefinition(positionEdge.x, positionEdge.y);
    });

    await test.step('2.Добавление атрибутов определению связи и ввод значений для двух локализаций', async () => {
        // Активируем чекбокс "Объекты", чтобы они были видны в дереве
        await navigator.enableObjectsDisplay();
        // Открыть дерево объекта, тем самым увидим связь в навигаторе
        await navigator.clickOnItemMenu(constants.TEST_METHODOLOGY_SYMBOL_OWAS, { button: 'left' }, 10);
        // Открываю модальное окно свойств связи
        await navigator.clickOnItemMenu(edgeName, { clickCount: 2 }, 10);
        await elementProperty.addAttributes(attributesToAdd);
        // Задаем значение каждому атрибуту
        // json
        await elementProperty.editAttributeJson();
        // datatime
        await elementProperty.editAttributeDatatime();
        // date
        await elementProperty.editAttributeData();
        // link (two locale)
        await elementProperty.editAttributeLink('', 'link', attributesLocaleValue.link);
        // node
        await elementProperty.editAttributeNode(firstLocaleModelName.ruName);
        // text (two locale)
        await elementProperty.editAttributeStr('', 'text', attributesLocaleValue.text);
        // time 
        await elementProperty.editAttributeTime();
        // string (two locale)
        await elementProperty.editAttributeStr('', 'string', attributesLocaleValue.string);
        // number
        await elementProperty.editAttributeNumber('1098374', 'number');
        // test_attribute
        await elementProperty.editAttributeNumber('1837410', 'test_attribute');
        // period
        await elementProperty.editAttributePeriod('22.02.2022', '23.02.2022');
        // selection
        await elementProperty.editAttributeSelection(attributesLocaleValue.selection.ruName);
        // mselection
        await elementProperty.editAttributeMultipleSelection(attributesLocaleValue.mselection.ruName);
        // Клик "Сохранить"
        await elementProperty.clickSaveButton();
    });

    await test.step('3.Смена локализации на английскую. Проверка смены значений', async () => {
        // Выйти из приложения 
        await header.logOut();
        await loginPage.signIn({ locale: "EN" });
        // Активируем чекбокс "Объекты", чтобы они были видны в дереве
        await navigator.enableObjectsDisplay();
        // Раскрываем дерево БД
        await navigator.clickOnItemMenu(dataBaseName, { button: 'left' }, 15);
        await page.waitForTimeout(constants.SHORT_WAIT);
        // Раскрываем дерево объекта
        await navigator.clickOnItemMenu(constants.TEST_METHODOLOGY_SYMBOL_OWAS, { button: 'left' }, 15);
        // Клик ПКМ по определению связи в дереве Навигатора → Свойства
        await navigator.clickOnItemMenu(edgeName, { button: 'right' }, 15);
        await contextMenu.clickProperties();
        // Проверка, что в окне "Свойства" отображаются добавленные атрибуты со значениями для английской локализации (link, string, text, node, select, mselect)
        // assert link
        await expect(elementProperty.getValueAttribute('link')).toContainText(attributesLocaleValue.link.enName);
        // assert string
        await expect(elementProperty.getValueAttribute('string')).toContainText(attributesLocaleValue.string.enName);
        // assert text
        await expect(elementProperty.getValueAttribute('text')).toContainText(attributesLocaleValue.text.enName);
        // assert node 
        await expect(elementProperty.getValueAttribute('node')).toHaveText(firstLocaleModelName.enName);
        // assert select 
        await expect(elementProperty.getValueAttribute(/^select123456789/)).toHaveText(attributesLocaleValue.selection.enName);
        // assert mselect
        await expect(elementProperty.getValueAttribute(/^mselect123456789/)).toHaveText(attributesLocaleValue.mselection.enName.join(""));
    });

    await test.step('4.Изменение значений у атрибутов для одной локализации', async () => {
        // Задаем новые значения для английской локали
        // link 
        await elementProperty.editAttributeLink('1');
        // string
        await elementProperty.editAttributeStr('2', 'string');
        // text
        await elementProperty.editAttributeStr('3', 'text');
        // Клик по кнопке Сохранить в окне Свойства
        await elementProperty.clickSaveButton();
        // Клик ПКМ по определению связи в дереве Навигатора → Свойства
        await navigator.clickOnItemMenu(edgeName, { button: 'right' }, 15);
        await contextMenu.clickProperties();
        // Проверка, что в окне "Свойства" отображаются изменённые атрибуты со значениями для английской локализации (link, string, text)
        // assert link
        await expect(elementProperty.getValueAttribute('link')).toContainText(attributesLocaleValue.link.enName + '1');
        // assert string
        await expect(elementProperty.getValueAttribute('string')).toContainText(attributesLocaleValue.string.enName + '2');
        // assert text
        // text.fixme('https://jira.silaunion.ru/browse/BPM-7068') Курсор должен стоять в конце строки при редактировании атрибута "text" - сейчас в начале
        // await expect(elementProperty.getValueAttribute('text')).toContainText(attributesLocaleValue.text.enName + '3');
        await elementProperty.clickSaveButton();
    });

    await test.step('5.Смена локализации на русскую. Проверка смены значений', async () => {
        // Выйти из приложения 
        await header.logOut();
        await loginPage.signIn({});
        // Активируем чекбокс "Объекты", чтобы они были видны в дереве
        await navigator.enableObjectsDisplay();
        // Раскрываем дерево БД
        await navigator.clickOnItemMenu(dataBaseName, { button: 'left' }, 15);
        await page.waitForTimeout(constants.SHORT_WAIT);
        // Раскрываем дерево объекта
        await navigator.clickOnItemMenu(constants.TEST_METHODOLOGY_SYMBOL_OWAS, { button: 'left' }, 15);
        // Клик ПКМ по определению связи в дереве Навигатора → Свойства
        await navigator.clickOnItemMenu(edgeName, { button: 'right' }, 15);
        await contextMenu.clickProperties();
        // Проверка, что в окне “Свойства“ отображаются атрибуты со значениями для русской локализации без изменений
        // assert link
        await expect(elementProperty.getValueAttribute('link')).toContainText(attributesLocaleValue.link.ruName);
        // assert string
        await expect(elementProperty.getValueAttribute('string')).toContainText(attributesLocaleValue.string.ruName);
        // assert text
        await expect(elementProperty.getValueAttribute('text')).toContainText(attributesLocaleValue.text.ruName);
        // assert node 
        await expect(elementProperty.getValueAttribute('node')).toHaveText(firstLocaleModelName.ruName);
        // assert select 
        await expect(elementProperty.getValueAttribute(/^select123456789/)).toHaveText(attributesLocaleValue.selection.ruName);
        // assert mselect
        await expect(elementProperty.getValueAttribute(/^mselect123456789/)).toHaveText(attributesLocaleValue.mselection.ruName.join(""));
    });

    await test.step('6.Изменение значений у атрибутов', async () => {
        /*
        Поменять значения всех атрибутов
Клик по кнопке Сохранить в окне Свойства
Клик ПКМ по определению связи в дереве Навигатора → Свойства
Ожидаемый результат: в окне Свойства отображаются изменённые атрибуты со значениями для русской локализации.  
У атрибутов Выбор/Множественный выбор значение изменилось. 
У атрибута “Ссылка на документ“ значение изменилось
        */


    });

    await test.step('7.Удаление значений у атрибутов', async () => {

    });

}, constants.TEST_TIMEOUT);

Помоги типизировать через ts, этот файл написан на js