<script>
import { createApp, h } from 'vue'
import Child from './Child.vue'
import NestedMore from './NestedMore.vue'
import NativeTypes from './NativeTypes.vue'
import EventEmit from './EventEmit.vue'
import EventNesting from './EventNesting.vue'
import AsyncComponent from './AsyncComponent.vue'
import SuspenseExample from './SuspenseExample.vue'
import Provide from './Provide.vue'
import Condition from './Condition.vue'
import VModelExample from './VModelExample.vue'
import Ghost from './Ghost.vue'
import Other from './Other.vue'
import SetupRender from './SetupRender.js'
import MyForm from './Form.vue'
import Functional from './Functional.vue'
import Heavy from './Heavy.vue'
import Mixins from './Mixins.vue'
import Animation from './Animation.vue'
import SetupScript from './SetupScript.vue'
import SetupDataLike from './SetupDataLike.vue'
import SetupTSScriptProps from './SetupTSScriptProps.vue'
import DomOrder from './DomOrder.vue'
import IndexComponent from './IndexComponent/index.vue'

import SimplePlugin from './devtools-plugin/simple'

export default {
  name: 'MyApp',

  components: {
    Child,
    NestedMore,
    NativeTypes,
    EventEmit,
    EventNesting,
    AsyncComponent,
    SuspenseExample,
    Provide,
    Condition,
    VModelExample,
    Ghost,
    Other,
    SetupRender,
    MyForm,
    Functional,
    Heavy,
    Mixins,
    Animation,
    SetupScript,
    SetupDataLike,
    SetupTSScriptProps,
    DomOrder,
    IndexComponent,
    Inline: {
      render: () => h('h3', 'Inline component definition'),
    },
  },

  data() {
    return {
      count: 0,
      text: 'Meow',
      time: 0,
    }
  },

  methods: {
    createApp() {
      const app = createApp(Child)
      app.use(SimplePlugin)
      app.mount('#nested-app')
    },

    startTimer() {
      this.stopTimer()
      this.timer = setInterval(() => {
        this.time++
      }, 1)
    },

    stopTimer() {
      clearInterval(this.timer)
    },

    onFoo(...args) {
      console.log('on foo', ...args)
    },

    onBar(...args) {
      console.log('on bar', ...args)
    },
  },
}
</script>

<template>
  <h1>Hello from Vue 3</h1>

  <div style="margin-bottom: 12px;">
    {{ count }} <button @click="count++">
      +1
    </button>
    <input v-model="text">
    <span>{{ text }}</span>
  </div>

  <div>
    <button @click="startTimer">
      Start timer
    </button>
    <button @click="stopTimer">
      Stop timer
    </button>
    <span>{{ time }}</span>
  </div>

  <div>
    <Heavy
      v-for="i in count"
      :key="i"
    />
  </div>

  <Child question="Life" />
  <IndexComponent />
  <NestedMore />
  <NativeTypes ref="nativeTypes" />
  <EventEmit
    @foo="onFoo"
    @bar="onBar"
  />
  <EventNesting />
  <AsyncComponent />
  <SuspenseExample />
  <Provide />
  <Animation />
  <Condition />
  <VModelExample />
  <Ghost />
  <Other />
  <SetupRender />
  <MyForm />
  <Functional msg="I am functional" />
  <Mixins />
  <SetupScript />
  <SetupDataLike />
  <SetupTSScriptProps my-prop="42" />
  <DomOrder />
  <Inline />
  <global />

  <h2>Store</h2>
  <div>
    {{ $store.getters.answer }}
    <button @click="$store.commit('increment')">
      +1
    </button>
    {{ $store.getters.twoFoo }}
  </div>

  <button @click="createApp()">
    Create nested app
  </button>
  <div id="nested-app" />

  <nav>
    <router-link to="/p1">
      page 1
    </router-link>
    |
    <router-link to="/p2">
      page 2
    </router-link>
  </nav>

  <router-view v-slot="{ Component }">
    <keep-alive>
      <component :is="Component" />
    </keep-alive>
  </router-view>
</template>
