import { getWindow } from '../src/utils/window.js'
import { svg } from '../src/modules/core/namespaces.js'

function tag(name, attrs, children) {
  const doc = getWindow().document
  const el = doc.createElementNS(svg, name)
  let i

  for (i in attrs) {
    el.setAttribute(i, attrs[i])
  }

  for (i in children) {
    if (typeof children[i] === 'string') {
      children[i] = doc.createTextNode(children[i])
    }

    el.appendChild(children[i])
  }

  return el
}

export function fixtures() {
  return tag(
    'svg',
    {
      height: 0,
      width: 0,
      id: 'inlineSVG'
    },
    [
      tag('defs', {}, [
        tag('linearGradient', {}, [
          tag('stop', { offset: '5%', 'stop-color': 'green' }),
          tag('stop', { offset: '95%', 'stop-color': 'gold' })
        ]),
        tag('radialGradient', {}, [
          tag('stop', { offset: '5%', 'stop-color': 'green' }),
          tag('stop', { offset: '95%', 'stop-color': 'gold' })
        ])
      ]),
      tag('desc', {}, ['Some description']),
      tag('path', {
        id: 'lineAB',
        d: 'M 100 350 l 150 -300',
        stroke: 'red',
        'stroke-width': '3',
        fill: 'none'
      }),
      tag('path', {
        id: 'lineBC',
        d: 'M 250 50 l 150 300',
        stroke: 'red',
        'stroke-width': '3',
        fill: 'none'
      }),
      tag('path', {
        d: 'M 175 200 l 150 0',
        stroke: 'green',
        'stroke-width': '3',
        fill: 'none'
      }),
      tag('path', {
        d: 'M 100 350 q 150 -300 300 0',
        stroke: 'blue',
        'stroke-width': '5',
        fill: 'none'
      }),
      tag(
        'g',
        {
          stroke: 'black',
          'stroke-width': '2',
          fill: 'black',
          id: 'pointGroup'
        },
        [
          tag('circle', {
            id: 'pointA',
            cx: '100',
            cy: '350',
            r: '3'
          }),
          tag('circle', {
            id: 'pointB',
            cx: '250',
            cy: '50',
            r: '50'
          }),
          tag('circle', {
            id: 'pointC',
            cx: '400',
            cy: '350',
            r: '50'
          })
        ]
      ),
      tag(
        'g',
        {
          'font-size': '30',
          font: 'sans-serif',
          fill: 'black',
          stroke: 'none',
          'text-anchor': 'middle',
          id: 'labelGroup'
        },
        [
          tag(
            'text',
            {
              x: '100',
              y: '350',
              dy: '-30'
            },
            ['A']
          ),
          tag(
            'text',
            {
              x: '250',
              y: '50',
              dy: '-10'
            },
            ['B']
          ),
          tag(
            'text',
            {
              x: '400',
              y: '350',
              dx: '30'
            },
            ['C']
          )
        ]
      ),
      tag('polygon', { points: '200,10 250,190 160,210' }),
      tag('polyline', { points: '20,20 40,25 60,40 80,120 120,140 200,180' })
    ]
  )
}

export function buildFixtures() {
  const doc = getWindow().document
  const body = doc.body || doc.documentElement

  const div = doc.createElement('div')
  div.id = 'fixtures'

  try {
    // FIXME: doesn't work in svgdom
    div.style.position = 'absolute'
    div.style.top = 0
    div.style.left = 0
  } catch (e) {
    //
  }

  div.appendChild(fixtures())
  body.appendChild(div)
}

export function buildCanvas() {
  const doc = getWindow().document
  const body = doc.body || doc.documentElement

  const div = doc.createElement('div')
  div.id = 'canvas'

  try {
    // FIXME: doesn't work in svgdom
    div.style.position = 'absolute'
    div.style.top = 0
    div.style.left = 0
  } catch (e) {
    //
  }
  body.appendChild(div)
}

export function clear() {
  const doc = getWindow().document
  const canvas = doc.getElementById('canvas')
  const fixtures = doc.getElementById('fixtures')

  // remove if present
  fixtures && fixtures.parentNode.removeChild(fixtures)
  canvas.parentNode.removeChild(canvas)
  ;[...doc.querySelectorAll('svg')].forEach((el) =>
    el.parentNode.removeChild(el)
  )
}