<template>
  <div>
    <v-toolbar dark>
      <v-spacer />
      <v-toolbar-title>시리즈 장르 관리</v-toolbar-title>
      <v-spacer />
    </v-toolbar>

    <br>

    <v-container>
      <v-row>
        <v-col cols="10" />
        <v-col>
          <v-btn
            block
            color="#9970ff"
            dark
            depressed
            @click="showWriteDialog"
          >
            시리즈 장르 등록
          </v-btn>
        </v-col>
      </v-row>

      <v-row>
        <v-col>
          <v-data-table
            :headers="headers"
            :items="series_genre_list"
            :loading="is_loading"
            item-key="id"
            class="elevation-1"
            hide-default-footer
            disable-pagination
          >
            <template v-slot:body="props">
              <draggable
                v-model="props.items"
                tag="tbody"
                @end="onDropCallback(props.items)"
              >
                <tr
                  v-for="(item, index) in props.items"
                  :key="index"
                >
                  <td>
                    {{ item.genre }}
                  </td>
                  <td>
                    <h3 v-if="item.isAdult">
                      O
                    </h3>
                    <h3 v-else>
                      X
                    </h3>
                  </td>
                  <td>
                    <v-row>
                      <v-col />
                      <v-col>
                        <v-btn
                          :disabled="is_loading"
                          @click="deleteConfirm(item)"
                        >
                          삭제
                        </v-btn>
                      </v-col>
                      <v-col />
                    </v-row>
                  </td>
                </tr>
              </draggable>
            </template>
          </v-data-table>
        </v-col>
      </v-row>
    </v-container>

    <v-dialog
      v-model="show_write_dialog"
      max-width="1000px"
      persistent
    >
      <v-card>
        <v-card-title>
          시리즈 장르 등록
        </v-card-title>
        <v-card-text>
          <v-row align="center">
            <v-col cols="4">
              장르
            </v-col>
            <v-col cols="8">
              <v-text-field
                v-model="series_genre.genre"
                label="장르"
                required
              />
            </v-col>
          </v-row>
        </v-card-text>
        <v-card-text>
          <v-row>
            <v-col cols="4">
              19금
            </v-col>
            <v-col cols="8">
              <input
                v-model="series_genre.is_adult"
                type="checkbox"
              >
            </v-col>
          </v-row>
        </v-card-text>
        <v-card-actions v-show="!is_loading">
          <v-spacer />
          <v-btn
            color="blue darken-1"
            text
            @click="cancel"
          >
            취소
          </v-btn>
          <v-btn
            color="blue darken-1"
            text
            @click="submit"
          >
            등록
          </v-btn>
        </v-card-actions>
      </v-card>
    </v-dialog>

    <v-dialog
      v-model="show_delete_confirm_dialog"
      max-width="400px"
      persistent
    >
      <v-card>
        <v-card-text />
        <v-card-text>
          "{{ selected_series_genre.genre }}"을 삭제하시겠습니까?
        </v-card-text>
        <v-card-actions v-show="!is_loading">
          <v-spacer />
          <v-btn
            color="blue darken-1"
            text
            @click="deleteCancel"
          >
            취소
          </v-btn>
          <v-btn
            color="blue darken-1"
            text
            @click="deleteSeriesGenre"
          >
            확인
          </v-btn>
        </v-card-actions>
      </v-card>
    </v-dialog>
  </div>
</template>

<script>
import Draggable from 'vuedraggable';
import * as api from '@/api/audio_content_series';

export default {
  name: "ContentSeriesGenre",
  components: {Draggable},
  data() {
    return {
      is_loading: false,
      show_delete_confirm_dialog: false,
      show_write_dialog: false,
      selected_series_genre: {},
      series_genre: {is_adult: false},
      series_genre_list: [],
      headers: [
        {
          text: '장르',
          align: 'center',
          sortable: false,
          value: 'genre',
        },
        {
          text: '19금',
          align: 'center',
          sortable: false,
          value: 'isAdult',
        },
        {
          text: '관리',
          align: 'center',
          sortable: false,
          value: 'management'
        },
      ],
    }
  },

  async created() {
    await this.getSeriesGenreList();
  },

  methods: {
    notifyError(message) {
      this.$dialog.notify.error(message)
    },

    notifySuccess(message) {
      this.$dialog.notify.success(message)
    },

    showWriteDialog() {
      this.show_write_dialog = true
    },

    cancel() {
      this.series_genre = {is_adult: false}
      this.selected_series_genre = {}
      this.show_write_dialog = false
    },

    deleteConfirm(series_genre) {
      this.selected_series_genre = series_genre
      this.show_delete_confirm_dialog = true
    },

    deleteCancel() {
      this.selected_series_genre = {}
      this.show_delete_confirm_dialog = false
    },

    async submit() {
      if (this.is_loading) return;
      this.isLoading = true

      try {
        const res = await api.createAudioContentSeriesGenre(this.series_genre.genre, this.series_genre.is_adult)
        if (res.status === 200 && res.data.success === true) {
          this.cancel()
          this.notifySuccess('등록되었습니다.')

          this.series_genre_list = []
          await this.getSeriesGenreList()
        } else {
          this.notifyError(res.data.message || '알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
        }
      } catch (e) {
        this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
      } finally {
        this.is_loading = false
      }
    },

    async getSeriesGenreList() {
      this.is_loading = true

      try {
        const res = await api.getAudioContentSeriesGenreList()
        if (res.status === 200 && res.data.success === true) {
          this.series_genre_list = res.data.data
        } else {
          this.notifyError(res.data.message || '알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
        }
      } catch (e) {
        this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
      } finally {
        this.is_loading = false
      }
    },

    async onDropCallback(items) {
      this.series_genre_list = items
      const ids = items.map((item) => {
        return item.id
      })

      try {
        this.is_loading = true
        const res = await api.updateAudioContentSeriesGenreOrders(ids)
        if (res.status === 200 && res.data.success === true) {
          this.notifySuccess(res.data.message)
        } else {
          this.notifyError(res.data.message || '알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
        }
      } catch (e) {
        this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
      } finally {
        this.is_loading = false
      }
    },

    async deleteSeriesGenre() {
      if (this.is_loading) return;
      this.is_loading = true

      try {
        let request = {id: this.selected_series_genre.id, isActive: false}

        const res = await api.updateAudioContentSeriesGenre(request)
        if (res.status === 200 && res.data.success === true) {
          this.show_delete_confirm_dialog = false
          this.cancel()
          this.notifySuccess('삭제되었습니다.')

          this.series_genre_list = []
          await this.getSeriesGenreList()
        } else {
          this.notifyError(res.data.message || '알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
        }
      } catch (e) {
        this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
      } finally {
        this.is_loading = false
      }
    },
  }
}
</script>

<style scoped>

</style>
