import { Selector } from "testcafe";
import testcafeconfig from "./testcafeconfig";
import Page from "./page-model";

fixture`Test labels`.page`${testcafeconfig.url}`;

const page = new Page();

test.meta("testID", "labels-001")("Remove/Activate Add/Delete Label from photo", async (t) => {
  await page.openNav();
  await t.click(Selector(".nav-labels"));
  const countImportantLabels = await Selector("a.is-label").count;
  await t.click(Selector("button.action-show-all"));
  const countAllLabels = await Selector("a.is-label").count;
  await t
    .expect(countAllLabels)
    .gt(countImportantLabels)
    .click(Selector("button.action-show-important"));
  await page.search("beacon");
  const LabelBeacon = await Selector("a.is-label").nth(0).getAttribute("data-uid");
  await t.click(Selector("a.is-label").withAttribute("data-uid", LabelBeacon));
  await page.setFilter("view", "Cards");
  const PhotoBeacon = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
  await t.click(Selector(".action-title-edit").withAttribute("data-uid", PhotoBeacon));
  const PhotoKeywords = await Selector(".input-keywords textarea").value;
  await t
    .expect(PhotoKeywords)
    .contains("beacon")
    .click(Selector("#tab-labels"))
    .click(Selector("button.action-remove"), { timeout: 5000 })
    .typeText(Selector(".input-label input"), "Test")
    .click(Selector("button.p-photo-label-add"))
    .click(Selector("#tab-details"));
  const PhotoKeywordsAfterEdit = await Selector(".input-keywords textarea").value;
  await t
    .expect(PhotoKeywordsAfterEdit)
    .contains("test")
    .expect(PhotoKeywordsAfterEdit)
    .notContains("beacon")
    .click(Selector(".action-close"));
  await page.openNav();
  await t.click(Selector(".nav-labels"));
  await page.search("beacon");
  await t.expect(Selector("div.no-results").visible).ok();
  await page.search("test");
  const LabelTest = await Selector("a.is-label").nth(0).getAttribute("data-uid");
  await t
    .click(Selector("a.is-label").withAttribute("data-uid", LabelTest))
    .click(Selector(".action-title-edit").withAttribute("data-uid", PhotoBeacon))
    .click(Selector("#tab-labels"))
    .click(Selector(".action-delete"), { timeout: 5000 })
    .click(Selector(".action-on"))
    .click(Selector("#tab-details"));
  const PhotoKeywordsAfterUndo = await Selector(".input-keywords textarea").value;
  await t
    .expect(PhotoKeywordsAfterUndo)
    .contains("beacon")
    .expect(PhotoKeywordsAfterUndo)
    .notContains("test")
    .click(Selector(".action-close"));
  await page.openNav();
  await t.click(Selector(".nav-labels"));
  await page.search("test");
  await t.expect(Selector("div.no-results").visible).ok();
  await page.search("beacon");
  await t.expect(Selector("a").withAttribute("data-uid", LabelBeacon).visible).ok();
});

test.meta("testID", "labels-002")("Rename Label", async (t) => {
  await page.openNav();
  await t.click(Selector(".nav-labels"));
  await page.search("zebra");
  const LabelZebra = await Selector("a.is-label").nth(0).getAttribute("data-uid");
  await t.click(Selector("a.is-label").nth(0));
  const FirstPhotoZebra = await Selector("div.is-photo", { timeout: 5000 })
    .nth(0)
    .getAttribute("data-uid");
  const SecondPhotoZebra = await Selector("div.is-photo", { timeout: 5000 })
    .nth(1)
    .getAttribute("data-uid");
  await page.setFilter("view", "Cards");
  await t.click(Selector(".action-title-edit").withAttribute("data-uid", FirstPhotoZebra));
  const FirstPhotoTitle = await Selector(".input-title input", { timeout: 5000 }).value;
  const FirstPhotoKeywords = await Selector(".input-keywords textarea", { timeout: 5000 }).value;
  await t
    .expect(FirstPhotoTitle)
    .contains("Zebra")
    .expect(FirstPhotoKeywords)
    .contains("zebra")
    .click(Selector("#tab-labels"))
    .click(Selector("div.p-inline-edit"))
    .typeText(Selector(".input-rename input"), "Horse", { replace: true })
    .pressKey("enter")
    .click(Selector("#tab-details"));
  const FirstPhotoTitleAfterEdit = await Selector(".input-title input", { timeout: 5000 }).value;
  const FirstPhotoKeywordsAfterEdit = await Selector(".input-keywords textarea", { timeout: 5000 })
    .value;
  await t
    .expect(FirstPhotoTitleAfterEdit)
    .contains("Horse")
    .expect(FirstPhotoKeywordsAfterEdit)
    .contains("horse")
    .expect(FirstPhotoTitleAfterEdit)
    .notContains("Zebra")
    .click(Selector(".action-close"));
  await page.openNav();
  await t.click(Selector(".nav-labels"));
  await page.search("horse");
  await t
    .expect(Selector("a").withAttribute("data-uid", LabelZebra).visible)
    .ok()
    .click(Selector("a.is-label").withAttribute("data-uid", LabelZebra))
    .expect(Selector("div").withAttribute("data-uid", SecondPhotoZebra).visible)
    .ok()
    .click(Selector(".action-title-edit").withAttribute("data-uid", FirstPhotoZebra))
    .click(Selector("#tab-labels"))
    .click(Selector("div.p-inline-edit"))
    .typeText(Selector(".input-rename input"), "Zebra", { replace: true })
    .pressKey("enter")
    .click(Selector(".action-close"));
  await page.openNav();
  await t.click(Selector(".nav-labels"));
  await page.search("horse");
  await t.expect(Selector("div.no-results").visible).ok();
});

test.meta("testID", "labels-003")("Add label to album", async (t) => {
  await page.openNav();
  await t.click(Selector(".nav-albums"));
  await page.search("Christmas");
  const AlbumUid = await Selector("a.is-album").nth(0).getAttribute("data-uid");
  await t.click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
  const PhotoCount = await Selector("div.is-photo").count;
  await page.openNav();
  await t.click(Selector(".nav-labels"));
  await page.search("landscape");
  const LabelLandscape = await Selector("a.is-label").nth(1).getAttribute("data-uid");
  await t.click(Selector("a.is-label").withAttribute("data-uid", LabelLandscape));
  const FirstPhotoLandscape = await Selector("div.is-photo").nth(0).getAttribute("data-uid");
  const SecondPhotoLandscape = await Selector("div.is-photo").nth(1).getAttribute("data-uid");
  const ThirdPhotoLandscape = await Selector("div.is-photo").nth(2).getAttribute("data-uid");
  const FourthPhotoLandscape = await Selector("div.is-photo").nth(3).getAttribute("data-uid");
  const FifthPhotoLandscape = await Selector("div.is-photo").nth(4).getAttribute("data-uid");
  const SixthPhotoLandscape = await Selector("div.is-photo").nth(5).getAttribute("data-uid");
  await page.openNav();
  await t.click(".nav-labels");
  await page.selectFromUID(LabelLandscape);

  const clipboardCount = await Selector("span.count-clipboard");
  await t.expect(clipboardCount.textContent).eql("1");
  await page.addSelectedToAlbum("Christmas", "album");
  await page.openNav();
  await t
    .click(Selector(".nav-albums"))
    .click(Selector("a.is-album").withAttribute("data-uid", AlbumUid));
  const PhotoCountAfterAdd = await Selector("div.is-photo", { timeout: 5000 }).count;
  await t.expect(PhotoCountAfterAdd).eql(PhotoCount + 6);
  await page.selectPhotoFromUID(FirstPhotoLandscape);
  await page.selectPhotoFromUID(SecondPhotoLandscape);
  await page.selectPhotoFromUID(ThirdPhotoLandscape);
  await page.selectPhotoFromUID(FourthPhotoLandscape);
  await page.selectPhotoFromUID(FifthPhotoLandscape);
  await page.selectPhotoFromUID(SixthPhotoLandscape);
  await page.removeSelected();
  const PhotoCountAfterDelete = await Selector("div.is-photo", { timeout: 5000 }).count;
  await t.expect(PhotoCountAfterDelete).eql(PhotoCountAfterAdd - 6);
});

test.meta("testID", "labels-004")("Delete label", async (t) => {
  await page.openNav();
  await t.click(Selector(".nav-labels"));
  await page.search("dome");
  const LabelDome = await Selector("a.is-label", { timeout: 5000 }).nth(0).getAttribute("data-uid");
  await t.click(Selector("a.is-label").withAttribute("data-uid", LabelDome));
  const FirstPhotoDome = await Selector("div.is-photo", { timeout: 5000 })
    .nth(0)
    .getAttribute("data-uid");
  await page.openNav();
  await t.click(".nav-labels");
  await page.selectFromUID(LabelDome);
  const clipboardCount = await Selector("span.count-clipboard", { timeout: 5000 });
  await t.expect(clipboardCount.textContent).eql("1");
  await page.deleteSelected();
  await page.search("dome");
  await t.expect(Selector("div.no-results").visible).ok();
  await page.openNav();
  await t.click(".nav-browse");
  await page.setFilter("view", "Cards");
  await t
    .click(Selector(".action-title-edit").withAttribute("data-uid", FirstPhotoDome))
    .click(Selector("#tab-labels"))
    .expect(Selector("td").withText("No labels found").visible)
    .ok()
    .typeText(Selector(".input-label input"), "Dome")
    .click(Selector("button.p-photo-label-add"));
});

/*Does not work on sqlite
test.skip("testID", "labels-005")("Check label count", async (t) => {
  await page.openNav();
  await t.click(Selector(".nav-labels"));
  await page.search("cat");
  const LabelCat = await Selector("a.is-label", { timeout: 55000 }).nth(0).getAttribute("data-uid");
  const CatCaption = await Selector("a[data-uid=" + LabelCat + "] div.caption").innerText;
  console.log(CatCaption);
  await t.click(Selector("a.is-label").withAttribute("data-uid", LabelCat));
  const countPhotosCat = await Selector("div.is-photo").count;
  await t.expect(CatCaption).contains(countPhotosCat.toString());
  console.log(countPhotosCat);
  await page.openNav();
  await t.click(Selector(".nav-labels"));
  await page.search("people");
  const LabelPeople = await Selector("a.is-label", { timeout: 55000 }).nth(0).getAttribute("data-uid");
  const PeopleCaption = await Selector("a[data-uid=" + LabelCat + "] div.caption").innerText;
  console.log(PeopleCaption);
  await t.click(Selector("a.is-label").withAttribute("data-uid", LabelPeople));
  const countPhotosPeople = await Selector("div.is-photo").count;
  await t.expect(CatCaption).contains(countPhotosPeople.toString());
  console.log(countPhotosPeople);
});*/
