import {defineComponent, onMounted, reactive, ref} from "vue";
import SaveForm from "@components/save-form";
import {DataTableRowKey, NButton, NDataTable, NDatePicker, NDescriptions, NDescriptionsItem, NFormItem, NImage, NInput, NModal, NSelect, NSpace, NTag, useDialog, useMessage} from "naive-ui";
import Pagination from "@components/pagination";
import TheTooltip from "@components/TheTooltip";
import AddMusic from "@views/music-library/project-music-sheet/module/klx/addMusic";
import {getMapValueByKey, getSelectDataFromObj} from "@/utils/objectUtil";
import {musicSheetAudioType, musicSheetAvailableType, musicSheetPaymentType, musicSheetSourceType, musicSheetType} from "@/utils/constant";
import {musicSheetApplicationExtendCategoryList, musicSheetApplicationOwnerList, musicSheetPageByApplication, musicSheetStatusList} from "@views/music-library/api";
import UpdateMusic from "@views/music-library/project-music-sheet/module/kt/updateMusic";
import {subjectPage, sysApplicationPage} from "@views/system-manage/api";
import {filterTimes} from "@/utils/dateUtil";

export default defineComponent({
  name: 'music-sheet-klx',
  props: {
    appKey: {
      type: String,
      default: 'KLX'
    }
  },

  setup(props) {
    const dialog = useDialog()
    const message = useMessage()
    const state = reactive({
      loading: false,
      appId: null as any,
      pagination: {
        page: 1,
        rows: 10,
        pageTotal: 0
      },
      searchForm: {
        keyword: null,
        musicSheetType: null, //曲目类型(SINGLE:单曲 CONCERT:合奏)
        subjectId: null, //声部ID
        subjectIds: null, //曲目声部ID集合
        musicCategoryIds: null, //曲目分类ID
        status: null, //曲目状态(0:停用,1:启用)
        sourceType: null, //来源类型/作者属性(PLATFORM: 平台; ORG: 机构; PERSON: 个人)
        paymentType: null, //收费类型(FREE:免费;VIP:会员;CHARGE:单曲收费)
        userId: null, //所属人
        musicCategoryId: null, //曲目分类ID
        times: null, // 上传时间
        audioType: null, //音频类型(HOMEMODE: 自制 COMMON: 普通)
        exquisiteFlag: null, //精品标志
        topFlag: null, //是否置顶(0:否;1:是)
        availableType: null, //可用途径 ORG 机构 PLATFORM 平台
        appAuditFlag: null, //是否审核版本
        detailFlag: null, //是否查询详情
        musicTagIds: [], //曲目标签
      },
      subjectList: [],
      dataList: [] as any[],
      musicSheetCategories: [],
      showAddDialog: false,
      showEditDialog: false,
      userIdDisable: true,
      userIdData: [] as any,
      updateRow: {} as any, // 修改选择的行
      musicTagList: [] as any,//曲目标签
      applicationId: null, //应用ID
    })

    onMounted(async () => {
      // 获取应用APP信息
      {
        const {data} = await sysApplicationPage({page: 1, rows: 1, appKey: props.appKey})
        const tempList = data.rows || []
        if (!tempList || tempList.length == 0) {
          message.error("加载项目信息失败");
          return
        }
        state.appId = tempList[0].id
        state.applicationId = tempList[0].id
      }
      // 加载声部
      {
        try {
          const {data} = await subjectPage({page: 1, rows: 999})
          const tempList = data.rows || []
          tempList.forEach((item: any) => {
            item.label = item.name
            item.value = item.id + ''
          })
          state.subjectList = tempList
        } catch {
        }

        //加载曲目分类列表
        {
          const {data} = await musicSheetApplicationExtendCategoryList({applicationIds: state.appId})
          if (data && data.length > 0) {
            state.musicSheetCategories = data[0].musicSheetCategories
          }
        }

        // 加载表格数据
        {
          getList()
        }
      }

    })

    const saveForm = ref()

    const onSearch = () => {
      saveForm.value?.submit()
    }
    const onBtnReset = () => {
      saveForm.value?.reset()
    }

    const onSubmit = () => {
      state.pagination.page = 1
      getList()
    }

    const checkedRowKeysRef = ref<DataTableRowKey[]>([])
    const handleCheck = (rowKeys: DataTableRowKey[]) => {
      checkedRowKeysRef.value = rowKeys
    }

    const getList = async () => {
      try {
        state.loading = true
        const {data} = await musicSheetPageByApplication({
          ...state.pagination,
          ...state.searchForm,
          ...filterTimes(state.searchForm.times, ['startTime', 'endTime']),
          applicationId:state.applicationId
        })
        state.pagination.pageTotal = Number(data.total)
        state.dataList = data.rows || []
      } catch {
      }
      state.loading = false
    }

    const onChangeStatus = (row: any) => {
      const statusStr = row.status ? '停用' : '启用'
      dialog.warning({
        title: '提示',
        content: `是否${statusStr}?`,
        positiveText: '确定',
        negativeText: '取消',
        onPositiveClick: async () => {
          try {
            await musicSheetStatusList({
              ids: new Array(row.id),
              status: !row.status
            })
            getList()
            message.success(`${statusStr}成功`)
          } catch {
          }
        }
      })
    }


    const onBatchChangeStatus = (status: boolean) => {
      const length = checkedRowKeysRef.value.length;
      if (length == 0) {
        message.warning("未选择数据")
      }
      const statusStr = !status ? '停用' : '启用'
      dialog.warning({
        title: '提示',
        content: `是否${statusStr}` + length + `条数据?`,
        positiveText: '确定',
        negativeText: '取消',
        onPositiveClick: async () => {
          try {
            await musicSheetStatusList({
              ids: checkedRowKeysRef.value,
              status: status
            })
            getList()
            message.success(`${statusStr}成功`)
          } catch {
          }
        }
      })
    }

    const columns = (): any => {
      return [
        {
          type: 'selection'
        },
        {
          title: '曲目信息',
          key: 'id',
          render: (row: any) => (
              <>
                <NDescriptions labelPlacement="left" column={1}>
                  <NDescriptionsItem label="曲目名称">
                    <TheTooltip content={row.name}/>{' '}
                  </NDescriptionsItem>
                  <NDescriptionsItem label="曲目编号">{row.id}</NDescriptionsItem>
                </NDescriptions>
              </>
          )
        },
        {
          title: '曲目来源',
          key: 'musicSheetCategoriesName',
          render: (row: any) => (
              <>
                <NDescriptions labelPlacement="left" column={1}>
                  <NDescriptionsItem label="曲目来源">
                    {getMapValueByKey(row.sourceType, new Map(Object.entries(musicSheetSourceType)))}
                  </NDescriptionsItem>
                  <NDescriptionsItem label="所属人">{row.userName}</NDescriptionsItem>
                </NDescriptions>
              </>
          )
        },
        {
          title: '封面图',
          key: 'musicCover',
          render(row: any): JSX.Element {
            return <NImage width={60} height={60} src={row.musicCover}/>
          }
        },
        {
          title: '曲目类型',
          key: 'musicSheetType',
          render: (row: any) => {
            return <div>{getMapValueByKey(row.musicSheetType, new Map(Object.entries(musicSheetType)))}</div>
          }
        },
        {
          title: '伴奏类型',
          key: 'audioType',
          render: (row: any) => {
            return <div>{getMapValueByKey(row.audioType, new Map(Object.entries(musicSheetAudioType)))}</div>
          }
        },
        {
          title: '可用声部',
          key: 'subjectIdNames'
        },
        {
          title: '标签',
          key: 'musicTagNames'
        },
        {
          title: '可用途径',
          key: 'availableType',
          render: (row: any) => {
            return <div>{getMapValueByKey(row.availableType, new Map(Object.entries(musicSheetAvailableType)))}</div>
          }
        },
        {
          title: '是否置顶',
          key: 'topFlag',
          render: (row: any) => {
            return <div>{row.topFlag ? '是' : '否'}</div>
          }
        },
        {
          title: '是否精品',
          key: 'exquisiteFlag',
          render: (row: any) => {
            return <div>{row.topFlag ? '是' : '否'}</div>
          }
        },
        {
          title: '收费方式',
          key: 'paymentType',
          render: (row: any) => {
            return <div>{getMapValueByKey(row.paymentType, new Map(Object.entries(musicSheetPaymentType)))}</div>
          }
        },
        {
          title: '曲目价格',
          key: 'musicPrice',
        },
        {
          title: '上传人',
          key: 'createByName'
        },
        {
          title: '上传时间',
          key: 'createTime'
        },
        {
          title: '状态',
          key: 'status',
          render(row: any) {
            return (
                <NTag type={row.status ? 'primary' : 'default'}>{row.status ? '启用' : '停用'}</NTag>
            )
          }
        },
        {
          title: '操作',
          key: 'operation',
          fixed: 'right',
          render(row: any) {
            return (
                <NSpace>
                  <NButton
                      type="primary"
                      size="small"
                      text
                      //v-auth="musicSheet/status1612431726029942786"
                      onClick={() => onChangeStatus(row)}
                  >
                    {row.status ? '停用' : '启用'}
                  </NButton>
                  <NButton
                      type="primary"
                      size="small"
                      text
                      //v-auth="musicSheet/update1602302618558099458"
                      onClick={() => {
                        state.showEditDialog = true
                        state.updateRow = row
                      }}
                  >
                    修改
                  </NButton>
                </NSpace>
            )
          }
        }
      ]
    }


    return () => {
      return (
          <div class="system-menu-container">
            <SaveForm
                ref={saveForm}
                model={state.searchForm}
                onSubmit={onSubmit}
                saveKey="music-sheet-klx"
                onSetModel={(val: any) => (state.searchForm = val)}
            >

              <NFormItem label="关键词" path="keyword">
                <NInput
                    placeholder="请输入曲目名称/编号"
                    v-model:value={state.searchForm.keyword}
                    clearable
                />
              </NFormItem>
              <NFormItem label="曲目来源" path="sourceType">
                <NSelect
                    placeholder="请选择曲目来源"
                    v-model:value={state.searchForm.sourceType}
                    options={getSelectDataFromObj(musicSheetSourceType)}
                    onUpdateValue={async (value: any) => {
                      state.userIdData = []
                      state.searchForm.userId = null
                      if (value) {
                        const {data} = await musicSheetApplicationOwnerList({page: 1, rows: 9999, sourceType: value, applicationId: state.appId})
                        const temp = data.rows || []
                        temp.forEach((next: any) => {
                          state.userIdData.push({
                            ...next,
                            label: next.userName,
                            value: next.userId
                          })
                        })
                        state.userIdDisable = false
                      } else {
                        state.userIdDisable = true
                      }
                    }}
                    clearable
                />
              </NFormItem>
              <NFormItem label="所属人" path="userId">
                <NSelect
                    placeholder="请选择所属人"
                    disabled={state.userIdDisable}
                    v-model:value={state.searchForm.userId}
                    options={state.userIdData}
                    clearable
                >
                </NSelect>
              </NFormItem>
              <NFormItem label="曲目类型" path="subjectType">
                <NSelect
                    placeholder="请选择曲目类型"
                    v-model:value={state.searchForm.musicSheetType}
                    options={getSelectDataFromObj(musicSheetType)}
                    clearable
                />
              </NFormItem>
              <NFormItem label="伴奏类型" path="audioType">
                <NSelect
                    placeholder="请选择伴奏类型"
                    v-model:value={state.searchForm.audioType}
                    options={getSelectDataFromObj(musicSheetAudioType)}
                    clearable
                />
              </NFormItem>
              <NFormItem label="可用声部" path="subjectId">
                <NSelect
                    placeholder="请选择可用声部"
                    v-model:value={state.searchForm.subjectId}
                    options={state.subjectList}
                    clearable
                />
              </NFormItem>
              <NFormItem label="曲目标签" path="musicTagIds">
                <NSelect
                    placeholder="请选择曲目标签"
                    v-model:value={state.searchForm.musicTagIds}
                    options={state.musicTagList}
                    multiple
                    maxTagCount={2}
                    clearable
                />
              </NFormItem>
              {/*<NFormItem*/}
              {/*    label="可用途径"*/}
              {/*    path="availableType"*/}
              {/*>*/}
              {/*  <NSelect*/}
              {/*      placeholder="请选择可用途径"*/}
              {/*      v-model:value={state.searchForm.availableType}*/}
              {/*      options={getSelectDataFromObj(musicSheetAvailableType)}*/}
              {/*      clearable*/}
              {/*  >*/}
              {/*  </NSelect>*/}
              {/*</NFormItem>*/}
              <NFormItem
                  label="收费方式"
                  path="paymentType"
              >
                <NSelect
                    placeholder="请选择收费方式"
                    v-model:value={state.searchForm.paymentType}
                    options={getSelectDataFromObj(musicSheetPaymentType)}
                    clearable
                >
                </NSelect>
              </NFormItem>
              <NFormItem label="状态" path="status">
                <NSelect
                    v-model:value={state.searchForm.status}
                    placeholder="请选择状态"
                    options={
                      [
                        {
                          label: '启用',
                          value: true
                        },
                        {
                          label: '停用',
                          value: false
                        }
                      ] as any
                    }
                    clearable
                />
              </NFormItem>
              <NFormItem label="上传时间" path="authorFrom">
                <NDatePicker
                    v-model:value={state.searchForm.times}
                    type="daterange"
                    clearable
                    value-format="yyyy.MM.dd"
                    startPlaceholder="开始时间"
                    endPlaceholder="结束时间"
                />
              </NFormItem>
              <NFormItem>
                <NSpace>
                  <NButton type="primary" onClick={onSearch}>
                    搜索
                  </NButton>
                  <NButton type="default" onClick={onBtnReset}>
                    重置
                  </NButton>
                </NSpace>
              </NFormItem>
            </SaveForm>

            <div class={['section-container']}>
              <NSpace style={{paddingBottom: '12px'}}>
                <NButton
                    type="primary"
                    //v-auth="musicSheet/save1602302550719426561"
                    onClick={() => {
                      state.showAddDialog = true
                    }}
                >
                  新增
                </NButton>
                <NButton
                    disabled={checkedRowKeysRef.value.length == 0}
                    //v-auth="musicSheet/save1602302550719426561"
                    onClick={() => {
                      onBatchChangeStatus(false)
                    }}
                >
                  批量停用
                </NButton>
                <NButton
                    disabled={checkedRowKeysRef.value.length == 0}
                    //v-auth="musicSheet/save1602302550719426561"
                    onClick={() => {
                      onBatchChangeStatus(true)
                    }}
                >
                  批量启用
                </NButton>
              </NSpace>

              <NDataTable
                  loading={state.loading}
                  columns={columns()}
                  data={state.dataList}
                  rowKey={(row: any) => row.id}
                  onUpdateCheckedRowKeys={handleCheck}
              ></NDataTable>

              <Pagination
                  v-model:page={state.pagination.page}
                  v-model:pageSize={state.pagination.rows}
                  v-model:pageTotal={state.pagination.pageTotal}
                  onList={getList}
                  sync
                  saveKey="music-sheet-klx"
              ></Pagination>
            </div>

            <NModal
                v-model:show={state.showAddDialog}
                preset="dialog"
                showIcon={false}
                title={'添加曲目'}
                style={{width: '1200px'}}
            >
              <AddMusic
                  onClose={() => (state.showAddDialog = false)}
                  onGetList={onSubmit}
                  subjectList={state.subjectList}
                  appId={state.appId}
                  musicSheetCategories={state.musicSheetCategories}
              />
            </NModal>
            <NModal
                v-model:show={state.showEditDialog}
                preset="dialog"
                showIcon={false}
                title={'修改曲目'}
                style={{width: '500px'}}
            >
              <UpdateMusic
                  onClose={() => (state.showEditDialog = false)}
                  onGetList={() => {
                    state.pagination.page = 1
                    getList()
                  }}
                  rowData={state.updateRow}
                  appId={state.appId}
                  musicSheetCategories={state.musicSheetCategories}
              />
            </NModal>
          </div>
      )
    }

  }
})