// Path: src/main/java/ru/colibri/ui/core/exception/ElementFoundOnPageException.java
// public class ElementFoundOnPageException extends RuntimeException {
//     public ElementFoundOnPageException(String elementName, String pageName) {
//         super("Element \"" + elementName + " found on  \"" + pageName + "\". But should not be there.");
//     }
// }
// 
// Path: src/main/java/ru/colibri/ui/core/fields/IElement.java
// public interface IElement {
//     String getName();
// 
//     String getContentDesc();
// 
//     String getId();
// 
//     String getText();
// 
//     String getXpath();
// 
//     String getNSPredicate();
// 
//     boolean isSpecific();
// }
// 
// Path: src/main/java/ru/colibri/ui/core/steps/AbsSteps.java
// @Log
// public abstract class AbsSteps extends Steps implements InitializingBean {
// 
//     private static final int TIMEOUT = 7;
//     private int currentTimeout;
// 
//     @Autowired
//     protected TestContext testContext;
// 
//     @Autowired
//     protected AppiumDriver driver;
// 
//     @Autowired(required = false)
//     protected IFinder finder;
// 
//     @Autowired
//     protected IPageProvider pageProvider;
// 
//     @Autowired
//     protected DriversSettings driverSettings;
// 
//     protected IPage getCurrentPage() {
//         return pageProvider.getCurrentPage();
//     }
// 
//     @Override
//     public void afterPropertiesSet() throws Exception {
//         log.info(String.format("Bean %s loaded", this.getClass().getSimpleName()));
//     }
// 
//     protected DriversSettings getDriversSettings() {
//         return driverSettings;
//     }
// 
//     protected WebElement getWebElementByName(String elementName) {
//         IElement element = getCurrentPage().getElementByName(elementName);
//         return finder.findWebElement(element);
//     }
// 
//     protected void decreaseImplicitlyWait() {
//         decreaseImplicitlyWait(TIMEOUT);
//     }
// 
//     protected void decreaseImplicitlyWait(int timeout) {
//         currentTimeout = getDriversSettings().getImplicitlyWaitInSeconds();
//         driver.manage().timeouts().implicitlyWait(timeout, TimeUnit.SECONDS);
//     }
// 
//     protected void increaseImplicitlyWait() {
//         driver.manage().timeouts().implicitlyWait(currentTimeout, TimeUnit.SECONDS);
//     }
// }
// 
// Path: src/main/java/ru/colibri/ui/settings/general/PropertyUtils.java
// @Slf4j
// @Service
// public class PropertyUtils {
//     private final static Pattern propertyPattern = compile("(#)([A-Za-z0-9_-]+?)(#)");
// 
//     @Autowired
//     private AppSettings appSettings;
// 
//     public static Properties readProperty(String... filePaths) {
//         Properties props = new Properties();
//         for (String path : filePaths) {
//             try (InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(path), UTF_8)) {
//                 props.load(inputStreamReader);
//             } catch (IOException e) {
//                 throw new RuntimeException("Ошибка загрузки настроек драйвера: ", e);
//             }
//         }
//         return props;
//     }
// 
//     public String injectProperties(String text) {
//         Map<String, String> userProfile = appSettings.getUserProfile();
//         Matcher matcher = propertyPattern.matcher(text);
//         if (!matcher.find()) {
//             return text;
//         }
//         String propertyKey = matcher.group(2);
//         String propertyValue = userProfile.get(propertyKey);
//         if (propertyValue == null) {
//             log.error("Couldn't find property {} for user {}", propertyKey, System.getenv().getOrDefault(ColibriStartFlags.USER, "user not defined"));
//             return text;
//         }
//         return matcher.replaceAll(propertyValue);
//     }
// }


import io.appium.java_client.MobileBy;
import org.jbehave.core.annotations.Named;
import org.jbehave.core.annotations.Then;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ru.colibri.ui.core.exception.ElementFoundOnPageException;
import ru.colibri.ui.core.fields.IElement;
import ru.colibri.ui.core.steps.AbsSteps;
import ru.colibri.ui.settings.general.PropertyUtils;
import ru.yandex.qatools.allure.annotations.Step;
import static java.lang.String.format;
package ru.colibri.ui.steps.ios;



@Component
public class IOSPageSteps extends AbsSteps {

    @Autowired
    private PropertyUtils propertyUtils;

    @Step
    @Then("на экране нет \"$elementName\"")
    public void checkNoElement(@Named("$elementName") String elementName) {
        IElement element = getCurrentPage().getElementByName(elementName);
        try {
            finder.findWebElement(element);
            throw new ElementFoundOnPageException(elementName, getCurrentPage().getName());
        } catch (Exception ignored) {
        }
    }

    @Step
    @Then("на экране есть надпись \"$textOrKeyword\"")
    public void checkText(@Named("$textOrKeyword") String textOrKeyword) {
        String text = propertyUtils.injectProperties(textOrKeyword);
// Path: src/main/java/ru/colibri/ui/core/exception/ElementFoundOnPageException.java
// public class ElementFoundOnPageException extends RuntimeException {
//     public ElementFoundOnPageException(String elementName, String pageName) {
//         super("Element \"" + elementName + " found on  \"" + pageName + "\". But should not be there.");
//     }
// }
// 
// Path: src/main/java/ru/colibri/ui/core/fields/IElement.java
// public interface IElement {
//     String getName();
// 
//     String getContentDesc();
// 
//     String getId();
// 
//     String getText();
// 
//     String getXpath();
// 
//     String getNSPredicate();
// 
//     boolean isSpecific();
// }
// 
// Path: src/main/java/ru/colibri/ui/core/steps/AbsSteps.java
// @Log
// public abstract class AbsSteps extends Steps implements InitializingBean {
// 
//     private static final int TIMEOUT = 7;
//     private int currentTimeout;
// 
//     @Autowired
//     protected TestContext testContext;
// 
//     @Autowired
//     protected AppiumDriver driver;
// 
//     @Autowired(required = false)
//     protected IFinder finder;
// 
//     @Autowired
//     protected IPageProvider pageProvider;
// 
//     @Autowired
//     protected DriversSettings driverSettings;
// 
//     protected IPage getCurrentPage() {
//         return pageProvider.getCurrentPage();
//     }
// 
//     @Override
//     public void afterPropertiesSet() throws Exception {
//         log.info(String.format("Bean %s loaded", this.getClass().getSimpleName()));
//     }
// 
//     protected DriversSettings getDriversSettings() {
//         return driverSettings;
//     }
// 
//     protected WebElement getWebElementByName(String elementName) {
//         IElement element = getCurrentPage().getElementByName(elementName);
//         return finder.findWebElement(element);
//     }
// 
//     protected void decreaseImplicitlyWait() {
//         decreaseImplicitlyWait(TIMEOUT);
//     }
// 
//     protected void decreaseImplicitlyWait(int timeout) {
//         currentTimeout = getDriversSettings().getImplicitlyWaitInSeconds();
//         driver.manage().timeouts().implicitlyWait(timeout, TimeUnit.SECONDS);
//     }
// 
//     protected void increaseImplicitlyWait() {
//         driver.manage().timeouts().implicitlyWait(currentTimeout, TimeUnit.SECONDS);
//     }
// }
// 
// Path: src/main/java/ru/colibri/ui/settings/general/PropertyUtils.java
// @Slf4j
// @Service
// public class PropertyUtils {
//     private final static Pattern propertyPattern = compile("(#)([A-Za-z0-9_-]+?)(#)");
// 
//     @Autowired
//     private AppSettings appSettings;
// 
//     public static Properties readProperty(String... filePaths) {
//         Properties props = new Properties();
//         for (String path : filePaths) {
//             try (InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(path), UTF_8)) {
//                 props.load(inputStreamReader);
//             } catch (IOException e) {
//                 throw new RuntimeException("Ошибка загрузки настроек драйвера: ", e);
//             }
//         }
//         return props;
//     }
// 
//     public String injectProperties(String text) {
//         Map<String, String> userProfile = appSettings.getUserProfile();
//         Matcher matcher = propertyPattern.matcher(text);
//         if (!matcher.find()) {
//             return text;
//         }
//         String propertyKey = matcher.group(2);
//         String propertyValue = userProfile.get(propertyKey);
//         if (propertyValue == null) {
//             log.error("Couldn't find property {} for user {}", propertyKey, System.getenv().getOrDefault(ColibriStartFlags.USER, "user not defined"));
//             return text;
//         }
//         return matcher.replaceAll(propertyValue);
//     }
// }


// Path: src/main/java/ru/colibri/ui/steps/ios/IOSPageSteps.java
import io.appium.java_client.MobileBy;
import org.jbehave.core.annotations.Named;
import org.jbehave.core.annotations.Then;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ru.colibri.ui.core.exception.ElementFoundOnPageException;
import ru.colibri.ui.core.fields.IElement;
import ru.colibri.ui.core.steps.AbsSteps;
import ru.colibri.ui.settings.general.PropertyUtils;
import ru.yandex.qatools.allure.annotations.Step;
import static java.lang.String.format;

package ru.colibri.ui.steps.ios;



@Component
public class IOSPageSteps extends AbsSteps {

    @Autowired
    private PropertyUtils propertyUtils;

    @Step
    @Then("на экране нет \"$elementName\"")
    public void checkNoElement(@Named("$elementName") String elementName) {
        IElement element = getCurrentPage().getElementByName(elementName);
        try {
            finder.findWebElement(element);
            throw new ElementFoundOnPageException(elementName, getCurrentPage().getName());
        } catch (Exception ignored) {
        }
    }

    @Step
    @Then("на экране есть надпись \"$textOrKeyword\"")
    public void checkText(@Named("$textOrKeyword") String textOrKeyword) {
        String text = propertyUtils.injectProperties(textOrKeyword);
        driver.findElement(MobileBy.iOSNsPredicateString(format("name contains '%1$s' or value contains '%1$s' or label contains '%1$s'", text)));