<template>
  <v-container fluid>
    <v-row class="align-stretch">
      <v-col v-for="({ row, rowMeta }, rowIndex) in data" :key="rowIndex" class="col-md-4 col-lg-3 col-sm-6 col-12">
        <v-hover v-slot="{ hover }">
          <v-card
            class="h-100"
            :elevation="hover ? 4 : 1"
            :ripple="!isLocked"
            @click="!isLocked && $emit('expandForm', { row, rowIndex, rowMeta })"
          >
            <v-carousel
              v-if="attachmentColumn"
              :continuous="false"
              :cycle="true"
              :show-arrows="false"
              hide-delimiter-background
              delimiter-icon="mdi-minus"
              height="200"
            >
              <v-carousel-item v-for="(cover, i) in getCovers(row)" :key="i">
                <v-img height="200" :src="cover.url" :alt="cover.title" />
              </v-carousel-item>
            </v-carousel>

            <!--            <v-card-title-->
            <!--              class="text-capitalize"-->
            <!--              v-text="row[primaryValueColumn]"-->
            <!--            />-->
            <v-card-text>
              <v-container>
                <v-row class="">
                  <v-col v-for="col in fields" v-show="showFields[col.title]" :key="col.title" class="col-12 mt-1 mb-2">
                    <label :for="`data-table-form-${col.title}`" class="body-2 text-capitalize caption grey--text">
                      <virtual-header-cell
                        v-if="isVirtualCol(col)"
                        :column="col"
                        :nodes="nodes"
                        :is-form="true"
                        :meta="meta"
                      />
                      <header-cell v-else :is-form="true" :value="col.title" :column="col" />
                    </label>

                    <virtual-cell
                      v-if="isVirtualCol(col)"
                      ref="virtual"
                      :column="col"
                      :row="row"
                      :nodes="nodes"
                      :meta="meta"
                    />
                    <table-cell
                      v-else
                      :value="row[col.title]"
                      :column="col"
                      :sql-ui="sqlUi"
                      :is-locked="isLocked"
                      class="xc-input body-2"
                      :meta="meta"
                    />
                  </v-col>
                </v-row>
              </v-container>
            </v-card-text>
          </v-card>
        </v-hover>
      </v-col>
    </v-row>
  </v-container>
</template>

<script>
import { isVirtualCol } from 'nocodb-sdk';
import VirtualHeaderCell from '../components/VirtualHeaderCell';
import HeaderCell from '../components/HeaderCell';
import VirtualCell from '../components/VirtualCell';
import TableCell from '../components/Cell';
export default {
  name: 'GalleryView',
  components: {
    TableCell,
    VirtualCell,
    HeaderCell,
    VirtualHeaderCell,
  },
  props: [
    'nodes',
    'table',
    'showFields',
    'availableColumns',
    'meta',
    'data',
    'primaryValueColumn',
    'showSystemFields',
    'sqlUi',
    'coverImageField',
    'viewId',
    'isLocked',
  ],
  data() {
    return {
      galleryView: {},
    };
  },
  computed: {
    attachmentColumn() {
      return (
        this.coverImageField &&
        this.meta &&
        this.meta.columns &&
        this.meta.columns.find(c => c.id === this.coverImageField)
      );
    },
    fields() {
      if (this.availableColumns) {
        return this.availableColumns;
      }

      const hideCols = ['created_at', 'updated_at'];

      if (this.showSystemFields) {
        return this.meta.columns || [];
      } else {
        return (
          this.meta.columns.filter(
            c =>
              !(c.pk && c.ai) &&
              !hideCols.includes(c.title) &&
              !(this.meta.v || []).some(v => v.bt && v.bt.title === c.title)
          ) || []
        );
      }
    },
  },
  watch: {
    async coverImageField(v) {
      if (this.galleryView && v !== this.galleryView.fk_cover_image_col_id) {
        await this.$api.dbView.galleryUpdate(this.viewId, {
          ...this.galleryView,
          fk_cover_image_col_id: v,
        });
      }
    },
  },
  created() {
    this.loadView();
  },
  methods: {
    isVirtualCol,
    async loadView() {
      this.galleryView = await this.$api.dbView.galleryRead(this.viewId);
      this.$emit('update:coverImageField', this.galleryView.fk_cover_image_col_id);
    },
    getCovers(row) {
      if (
        this.attachmentColumn &&
        row[this.attachmentColumn.title] &&
        row[this.attachmentColumn.title][0] &&
        row[this.attachmentColumn.title]
      ) {
        try {
          return JSON.parse(row[this.attachmentColumn.title]);
        } catch (e) {}
      }
      return [{ url: 'https://via.placeholder.com/700?text=No%20image%20found' }];
    },
  },
};
</script>

<style scoped></style>
