import { loginAsFoobar } from '../roles'
import {
  generalSettingsButton,
  getNthStatus, getNthStatusMediaImg, getNthStatusSensitiveMediaButton, homeNavButton, markMediaSensitiveInput,
  scrollToStatus, settingsNavButton, neverMarkMediaSensitiveInput
} from '../utils'

import { homeTimeline } from '../fixtures'

fixture`023-mark-media-as-sensitive.js`
  .page`http://localhost:4002`

async function checkSensitivityForStatus (t, idx, sensitive) {
  if (sensitive) {
    await t
      .expect(getNthStatusSensitiveMediaButton(1 + idx).exists).ok()
      .expect(getNthStatusMediaImg(1 + idx).getAttribute('src')).match(/^blob:http:\/\/localhost/)
  } else {
    await t
      .expect(getNthStatusSensitiveMediaButton(1 + idx).exists).notOk()
      .expect(getNthStatusMediaImg(1 + idx).getAttribute('src')).match(/^http:\/\//)
  }
}

async function checkSensitivity (t, shouldBeSensitive) {
  const sensitiveKittenIdx = homeTimeline.findIndex(_ => _.spoiler === 'kitten CW')
  const sensitiveVideoIdx = homeTimeline.findIndex(_ => _.content === 'secret video')
  const videoIdx = homeTimeline.findIndex(_ => _.content === "here's a video")
  const sensitiveAnimatedKittenIdx = homeTimeline.findIndex(_ => _.content === "here's a secret animated kitten gif")
  const animatedKittenIdx = homeTimeline.findIndex(_ => _.content === "here's an animated kitten gif")

  await t.hover(getNthStatus(1))

  const expected = [
    [sensitiveKittenIdx, shouldBeSensitive(true)],
    [sensitiveVideoIdx, shouldBeSensitive(true)],
    [videoIdx, shouldBeSensitive(false)],
    [sensitiveAnimatedKittenIdx, shouldBeSensitive(true)],
    [animatedKittenIdx, shouldBeSensitive(false)]
  ]

  for (const [idx, sensitive] of expected) {
    await scrollToStatus(t, 1 + sensitiveKittenIdx)
    await checkSensitivityForStatus(t, idx, sensitive)
  }
}

async function changeSetting (t, input, checked) {
  await t
    .click(settingsNavButton)
    .click(generalSettingsButton)
    .click(input)
  if (checked) {
    await t.expect(input.checked).ok()
  } else {
    await t.expect(input.checked).notOk()
  }
  await t.click(homeNavButton)
}

async function doMarkMediaAsSensitive (t, checked) {
  await changeSetting(t, markMediaSensitiveInput, checked)
}

async function doNeverMarkMediaAsSensitive (t, checked) {
  await changeSetting(t, neverMarkMediaSensitiveInput, checked)
}

test('default sensitive settings', async t => {
  await loginAsFoobar(t)
  await checkSensitivity(t, sensitive => sensitive)
})

test('always mark media sensitive', async t => {
  await loginAsFoobar(t)
  await doMarkMediaAsSensitive(t, true)
  await checkSensitivity(t, () => true)
  // cleanup
  await doMarkMediaAsSensitive(t, false)
})

test('never mark media sensitive', async t => {
  await loginAsFoobar(t)
  await doNeverMarkMediaAsSensitive(t, true)
  await checkSensitivity(t, () => false)
  // cleanup
  await doNeverMarkMediaAsSensitive(t, false)
})

test('settings are mutually exclusive', async t => {
  await loginAsFoobar(t)
  await t
    .click(settingsNavButton)
    .click(generalSettingsButton)
    .click(markMediaSensitiveInput)
    .expect(markMediaSensitiveInput.checked).ok()
    .expect(neverMarkMediaSensitiveInput.checked).notOk()
    .click(neverMarkMediaSensitiveInput)
    .expect(markMediaSensitiveInput.checked).notOk()
    .expect(neverMarkMediaSensitiveInput.checked).ok()
    .click(markMediaSensitiveInput)
    .expect(markMediaSensitiveInput.checked).ok()
    .expect(neverMarkMediaSensitiveInput.checked).notOk()
    .click(markMediaSensitiveInput)
    .expect(markMediaSensitiveInput.checked).notOk()
    .expect(neverMarkMediaSensitiveInput.checked).notOk()
})