package main

import (
	"time"

	"github.com/GeertJohan/go.rice/embedded"
)

func init() {

	// define files
	file2 := &embedded.EmbeddedFile{
		Filename:    "file-demo.html",
		FileModTime: time.Unix(1599060246, 0),

		Content: string("<!DOCTYPE html>\n<html>\n<head>\n  <title>{{.ElementName}}</title>\n  <meta charset=\"utf-8\" />\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n</head>\n<body>\n  <h1>{{.ElementName}}</h1>\n  <{{.ElementName}}></{{.ElementName}}>\n\n  <h2>Events</h2>\n  <pre id=events></pre>\n</body>\n</html>\n"),
	}
	file3 := &embedded.EmbeddedFile{
		Filename:    "file-demo.ts",
		FileModTime: time.Unix(1599060246, 0),

		Content: string("import './index';\n\ndocument\n  .querySelector('{{.ElementName}}')!\n  .addEventListener('some-event-name', (e) => {\n    document.querySelector('#events')!.textContent = JSON.stringify(\n      e,\n      null,\n      '  '\n    );\n  });\n"),
	}
	file4 := &embedded.EmbeddedFile{
		Filename:    "file.scss",
		FileModTime: time.Unix(1599060246, 0),

		Content: string("{{.ElementName}} {\n}\n"),
	}
	file5 := &embedded.EmbeddedFile{
		Filename:    "file.ts",
		FileModTime: time.Unix(1599061942, 0),

		Content: string("/**\n * @module module/{{.ElementName}}\n * @description <h2><code>{{.ElementName}}</code></h2>\n *\n * @evt\n *\n * @attr\n *\n * @example\n */\nimport { define } from 'elements-sk/define';\nimport { html } from 'lit-html';\nimport { ElementSk } from '../../../infra-sk/modules/ElementSk';\n\nexport class {{.ClassName}} extends ElementSk {\n  private static template = (ele: {{.ClassName}}) =>\n    html`<h3>Hello world</h3>`;\n\n  constructor() {\n    super({{.ClassName}}.template);\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    this._render();\n  }\n};\n\ndefine('{{.ElementName}}', {{.ClassName}});"),
	}
	file6 := &embedded.EmbeddedFile{
		Filename:    "file_puppeteer_test.ts",
		FileModTime: time.Unix(1599060246, 0),

		Content: string("import * as path from 'path';\nimport { expect } from 'chai';\nimport {\n  setUpPuppeteerAndDemoPageServer,\n  takeScreenshot,\n} from '../../../puppeteer-tests/util';\n\ndescribe('{{.ElementName}}', () => {\n  const testBed = setUpPuppeteerAndDemoPageServer(\n    path.join(__dirname, '..', '..', 'webpack.config.ts')\n  );\n\n  beforeEach(async () => {\n    await testBed.page.goto(`${testBed.baseUrl}/dist/{{.ElementName}}.html`);\n    await testBed.page.setViewport({ width: 400, height: 550 });\n  });\n\n  it('should render the demo page (smoke test)', async () => {\n    expect(await testBed.page.$$('{{.ElementName}}')).to.have.length(1);\n  });\n\n  describe('screenshots', () => {\n    it('shows the default view', async () => {\n      await takeScreenshot(testBed.page, '{{.AppName}}', '{{.ElementName}}');\n    });\n  });\n});\n"),
	}
	file7 := &embedded.EmbeddedFile{
		Filename:    "file_test.ts",
		FileModTime: time.Unix(1599060246, 0),

		Content: string("import { {{.ClassName }} } from './{{.ElementName}}';\n\nimport { setUpElementUnderTest } from '../../../infra-sk/modules/test_util';\nimport { expect } from 'chai';\n\ndescribe('{{.ElementName}}', () => {\n  const newInstance = setUpElementUnderTest<{{.ClassName}}>('{{.ElementName}}');\n\n  let element: {{.ClassName}};\n  beforeEach(() => {\n    element = newInstance((el: {{.ClassName}}) => {\n      // Place here any code that must run after the element is instantiated but\n      // before it is attached to the DOM (e.g. property setter calls,\n      // document-level event listeners, etc.).\n    });\n  });\n\n  describe('some action', () => {\n    it('some result', () => {});\n      expect(element).to.not.be.null;\n  });\n});\n\n\n"),
	}
	file8 := &embedded.EmbeddedFile{
		Filename:    "index.ts",
		FileModTime: time.Unix(1599060246, 0),

		Content: string("import './{{.ElementName}}';\nimport './{{.ElementName}}.scss';\n"),
	}

	// define dirs
	dir1 := &embedded.EmbeddedDir{
		Filename:   "",
		DirModTime: time.Unix(1599060246, 0),
		ChildFiles: []*embedded.EmbeddedFile{
			file2, // "file-demo.html"
			file3, // "file-demo.ts"
			file4, // "file.scss"
			file5, // "file.ts"
			file6, // "file_puppeteer_test.ts"
			file7, // "file_test.ts"
			file8, // "index.ts"

		},
	}

	// link ChildDirs
	dir1.ChildDirs = []*embedded.EmbeddedDir{}

	// register embeddedBox
	embedded.RegisterEmbeddedBox(`templates`, &embedded.EmbeddedBox{
		Name: `templates`,
		Time: time.Unix(1599060246, 0),
		Dirs: map[string]*embedded.EmbeddedDir{
			"": dir1,
		},
		Files: map[string]*embedded.EmbeddedFile{
			"file-demo.html":         file2,
			"file-demo.ts":           file3,
			"file.scss":              file4,
			"file.ts":                file5,
			"file_puppeteer_test.ts": file6,
			"file_test.ts":           file7,
			"index.ts":               file8,
		},
	})
}
