package cz.moneta.test.dsl.util.task.ufo.operations;

import cz.moneta.test.dsl.Harness;
import cz.moneta.test.dsl.ufo.operations.search.OPS001_S001_ClientSearchPageUfoOperations;
import cz.moneta.test.dsl.ufo.operations.ufoOperations.*;

import java.util.function.Function;
import java.util.random.RandomGenerator;

import static cz.moneta.test.dsl.ufo.operations.ufoOperations.UKO720_S001_TaskList.TASK_ID_KEY;
import static cz.moneta.test.dsl.ufo.operations.ufoOperations.UKO720_S001_TaskPage.ID_OBJECT_IN_TASK_KEY;
import static cz.moneta.test.dsl.ufo.operations.ufoOperations.taskslist.TypesOfViewFilter.*;

public class TasksTasks {

    private final Harness harness;

    public TasksTasks(Harness harness) {
        this.harness = harness;
    }

    public Function<UKO720_S001_TaskList, UKO720_S001_TaskList> finishTask() {
        return start -> start
                .selectTypeOfView(ASSIGNED_BY_ME)
                .fillTaskID(harness.get(TASK_ID_KEY))
                .clickFind()
                .clickOpenTaskDetail()
                .clickSolve()
                .clickFinishTask()
                .fillSolveText("Duvod konce")
                .clickFinishOK()
                .assertStatusLabel("Úkol byl v pořádku dokončen !");
    }

    public Function<UKO720_S001_TaskList, UKO720_S001_TaskList> createSpecificTask(String rcOfExistingClient) {
        return start -> start
                .clickNewMainTask()
                .selectTaskCategory("Produkt - Běžný účet")
                .selectSubcategories("Změny a dotazy ke smlouvě")
                .fillBirthNumberInTask(rcOfExistingClient)
                .fillIdObjectInTask(String.valueOf(RandomGenerator.getDefault().nextInt(100000000, 999999999)))
                .fillIdOmInTask("02122120")
                .selectTaskType("Změny a dotazy ke smlouvě")
                .fillDescription("Zpracování sestavy")
                .clickAssign()
                .onTaskList()
                .assertStatusLabel("Úkol byl korektně přiřazen!")
                .saveTaskID();
    }

    public Function<UKO720_S001_TaskList, UKO720_S001_TaskList> createSimpleTask(String rcOfExistingClient) {
        return start -> start
                .clickNewMainTask()
                .selectTaskCategory("Ostatní - BPST")
                .selectSubcategories("Ostatní")
                .fillBirthNumberInTask(rcOfExistingClient)
                .fillIdObjectInTask("33214034")
                .selectTaskType("Ufo aplikace - podnět")
                .fillDescription("Test")
                .clickAssign()
                .onTaskList()
                .assertStatusLabel("Úkol byl korektně přiřazen!")
                .saveTaskID();
    }

    public Function<UKO720_S001_TaskList, UKO720_S001_TaskList> createSecondSimpleTask() {
        return start -> start
                .clickNewMainTask()
                .selectTaskCategory("Ostatní - BPST")
                .selectSubcategories("Nefunkčnost systému")
                .selectTaskType("Dokončení odeslání dokumentu")
                .fillDescription("Test-2")
                .clickAssign()
                .onTaskList()
                .assertStatusLabel("Úkol byl korektně přiřazen!")
                .saveSecondTaskID();
    }

    public Function<UKO720_S001_TaskPage, UKO720_S001_TaskDetail> createSubtask() {
        return start -> start
                .clickTaskTypeSubtask()
                .clickSpecificAttributes()
                .createSubtask()
                .selectTaskCategory("Ostatní - BPST")
                .selectSubcategories("Ostatní")
                .selectTaskType("Ufo aplikace - podnět")
                .clickSolution()
                .fillDescription("Test - subtask")
                .clickAssign()
                .onTaskDetail();
    }

    public Function<UKO720_S001_TaskPage, UKO720_S001_TaskPage> checkClientDetailInfo(String rcOfExistingClient) {
        return start -> start
                .clickClientDetailInfo()
                .assertClientRc(rcOfExistingClient)
                .checkPageNotContainsMenuElements()
                .closeSecondWindow();
    }

    public Function<UKO720_S001_TaskPage, UKO720_S001_TaskPage> checkObjectDetail() {
        return start -> start
                .storeIdObject()
                .clickIdObjectDetailInfo()
                .checkContractID(harness.get(ID_OBJECT_IN_TASK_KEY))
                .checkPageNotContainsMenuElements()
                .closeSecondWindow();
    }

    public Function<UKO720_S001_TaskPage, UKO720_S001_TaskPage> checkAttachmentUpload(String documentType, String attachmentPath, String attachmentTitle) {
        return start -> start
                .clickAddAttachment()
                .selectDocumentType(documentType)
                .fillFileUpload(attachmentPath)
                .fillFileTitle(attachmentTitle)
                .clickSaveAttachment()
                .checkTitleOfFirstAttachment(attachmentTitle);
    }

    public Function<UKO720_S001_TaskList, UKO720_S001_TaskPage> createTask() {
        return start -> start
                .clickNewMainTask() //T_0001591070101
                .selectTaskCategory("Produkt - Běžný účet")
                .selectSubcategories("Reklamace a Stížnosti")
                .selectTaskType("Stížnosti - standardní")
                .findUserAndSelectSolver()
                .selectClient("Ne")
                .fillClientOrBusinessName("AutoTest")
                .selectPreferredCanal("email")
                .typeIntoClientsEmail("matej.liska@moneta.cz")
                .fillDescription("Automattest")
                .clickAssign()
                .onTaskPage()
                .storeIdOfTask();
    }

    public Function<OPS001_S001_ClientSearchPageUfoOperations, UKO720_S001_TaskList> removeFraudAcccesAndOpenTasks() {
        return start -> start
                .clickSettings()
                .doubleClickOpsCallcentrumFraudAccess()
                .clickSaveChangeOfPrivilages()
                .clickTasks();
    }
}