/*
 * Copyright 2021 webtau maintainers
 * Copyright 2019 TWO SIGMA OPEN SOURCE, LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.testingisdocumenting.webtau;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

import java.util.*;

public class FakeWebDriver implements WebDriver {
    private final Map<String, List<WebElement>> fakesByCss = new HashMap<>();

    public void registerFakeElement(String css, WebElement webElement) {
        fakesByCss.computeIfAbsent(css, (key) -> new ArrayList<>()).add(webElement);
    }

    public void registerFakeElements(String css, List<WebElement> webElements) {
        fakesByCss.computeIfAbsent(css, (key) -> new ArrayList<>()).addAll(webElements);
    }

    @Override
    public void get(String url) {
    }

    @Override
    public String getCurrentUrl() {
        return null;
    }

    @Override
    public String getTitle() {
        return null;
    }

    @Override
    public List<WebElement> findElements(By by) {
        if (by instanceof By.ByCssSelector) {
            String rendered = by.toString();
            int idxOfColon = rendered.indexOf(":");
            String css = rendered.substring(idxOfColon + 1).trim();
            return fakesByCss.getOrDefault(css, Collections.emptyList());
        }

        return Collections.emptyList();
    }

    @Override
    public WebElement findElement(By by) {
        return null;
    }

    @Override
    public String getPageSource() {
        return null;
    }

    @Override
    public void close() {

    }

    @Override
    public void quit() {

    }

    @Override
    public Set<String> getWindowHandles() {
        return null;
    }

    @Override
    public String getWindowHandle() {
        return null;
    }

    @Override
    public TargetLocator switchTo() {
        return null;
    }

    @Override
    public Navigation navigate() {
        return null;
    }

    @Override
    public Options manage() {
        return null;
    }
}
