import { IViewProvider } from '@ibiz-template/controller';
import { ModelUtil } from '@ibiz-template/model';
import { useNamespace } from '@ibiz-template/vue-util';
import { computed, defineComponent, PropType, ref } from 'vue';
import '@ibiz-template/theme/style/components/view-shell/view-shell.scss';
import { IModal } from '@ibiz-template/runtime';

export const ViewShell = defineComponent({
  name: 'ViewShell',
  props: {
    context: { type: Object as PropType<IContext>, required: true },
    params: { type: Object as PropType<IParams> },
    modal: { type: Object as PropType<IModal> },
    isRouter: { type: Boolean },
    modelPath: { type: String, required: true },
  },
  setup(props) {
    const provider = ref<IViewProvider>();
    ModelUtil.getViewModel(props.modelPath, props.context).then(
      async viewModel => {
        provider.value = await ibiz.register.view.get(viewModel.source);
      },
    );
    const ns = useNamespace('view-shell');

    // 路由绘制的视图,添加一个上下文isRouter
    const cloneContext = computed(() => {
      const temp = props.context.clone();
      temp.isRouter = props.isRouter === true;
      return temp;
    });
    return { ns, provider, cloneContext };
  },
  render(h) {
    if (this.provider) {
      const opts = {
        attrs: {
          ...this.$props,
          ...this.$attrs,
          context: this.cloneContext,
        },
        on: this.$listeners,
      };
      return h('AppTransition', {}, [h(this.provider.component, opts)]);
    }
    return (
      <div class={this.ns.b()}>
        <i-spin size='large' fix></i-spin>
      </div>
    );
  },
});