import { ref } from 'vue'
import { analyzeKmzFile, XMLToJSON, JSONToXML } from '/@/utils/cesium/kmz'
import _ from 'lodash'
import JSZIP from 'jszip'
import { saveAs } from 'file-saver'

const fileAuthor = reactive({
  name: '',
  author: '',
})
const kmlStr = ref('')
const kmzFile = ref<any>(null)

const template = ref<any>({
  author: '',
  createTime: '',
  updateTime: '',
  missionConfig: {
    flyToWaylineMode: 'safely',
    finishAction: 'goHome',
    exitOnRCLost: 'goContinue',
    executeRCLostAction: 'goBack',
    takeOffSecurityHeight: 20,
    takeOffRefPoint: '0.000000,0.000000,0.000000',
    takeOffRefPointAGLHeight: 0,
    globalTransitionalSpeed: 15,
    globalRTHHeight: 80,
    droneInfo: {
      droneEnumValue: 0,
      droneSubEnumValue: 0,
    },
    payloadInfo: {
      payloadEnumValue: 0,
      payloadSubEnumValue: 0,
      payloadPositionIndex: 0,
    },
  },
  Folder: {
    templateType: 'waypoint',
    useGlobalTransitionalSpeed: 0,
    templateId: 0,
    waylineCoordinateSysParam: {
      coordinateMode: 'WGS84',
      heightMode: 'EGM96',
      globalShootHeight: 50,
      positioningType: 'GPS',
      surfaceFollowModeEnable: 1,
      surfaceRelativeHeight: 100,
    },
    autoFlightSpeed: 7,
    gimbalPitchMode: 'usePointSetting',
    globalWaypointHeadingParam: {
      waypointHeadingMode: 'followWayline',
      waypointHeadingAngle: 0,
      waypointPoiPoint: '0.000000,0.000000,0.000000',
      waypointHeadingPathMode: 'followBadArc',
    },
    globalWaypointTurnMode: 'toPointAndStopWithDiscontinuityCurvature',
    globalUseStraightLine: 0,
    Placemark: [
      {
        Point: {
          coordinates: '',
        },
        index: 0,
        ellipsoidHeight: 0,
        height: 0,
        useGlobalHeight: 0,
        useGlobalSpeed: 0,
        useGlobalHeadingParam: 1,
        useGlobalTurnParam: 0,
        gimbalPitchAngle: 0,
        actionGroup: {
          actionGroupId: 0,
          actionGroupStartIndex: 1,
          actionGroupEndIndex: 1,
          actionGroupMode: 'sequence',
          actionTrigger: {
            actionTriggerType: 'reachPoint',
          },
          action: [],
        },
      },
    ],
  },
})
const waylines = ref<any>({
  missionConfig: {
    flyToWaylineMode: 'safely',
    finishAction: 'goHome',
    exitOnRCLost: 'goContinue',
    executeRCLostAction: 'hover',
    takeOffSecurityHeight: 20,
    globalTransitionalSpeed: 10,
    distance: 0,
    duration: 0,
    droneInfo: {
      droneEnumValue: 67,
      droneSubEnumValue: 0,
    },
    payloadInfo: {
      payloadEnumValue: 52,
      payloadSubEnumValue: 0,
      payloadPositionIndex: 0,
    },
  },
  Folder: {
    templateId: 0,
    executeHeightMode: 'WGS84',
    waylineId: 0,
    autoFlightSpeed: 10,
    Placemark: [
      {
        Point: {
          coordinates: '0.000000, 0.000000',
        },
        index: 0,
        executeHeight: 116.57,
        waypointSpeed: 10,
        waypointHeadingParam: {
          waypointHeadingMode: 'followWayline',
        },
        waypointTurnParam: {
          waypointTurnMode: 'toPointAndStopWithDiscontinuityCurvature',
          waypointTurnDampingDist: 0,
        },
        useStraightLine: 1,
        actionGroup: [],
      },
    ],
  },
})

const useKmzTsa = () => {
  const init = async (fileUrl: string, fileContent?: string) => {
    const fileRes = await analyzeKmzFile(fileUrl)
    kmzFile.value = fileRes.zip
    const kmzRes = await fileRes.fileInfoObj['wpmz/template.kml']
    if (fileContent) {
      kmlStr.value = fileContent
      return false
    }
    kmlStr.value = kmzRes
    const tplXmlJson = XMLToJSON(kmzRes)
    template.value = tplXmlJson.Document
    return kmzRes
  }
  const create = async (waylineBasicInfo: { fileName: string; droneEnumValue: string; payloadEnumValue: string }) => {
    try {
      const { fileName, droneEnumValue, payloadEnumValue } = waylineBasicInfo
      const author = window.localStorage.getItem('username') || ''
      const createTime = new Date().getTime()
      // 模板
      const droneModel: { [key: string]: string } = {
        52: '0',
        53: '1',
        66: '0',
        67: '1',
        80: '0',
        81: '1',
      } as const
      const templateJson = {
        author,
        createTime,
        updateTime: createTime,
        missionConfig: {
          flyToWaylineMode: 'safely',
          finishAction: 'goHome',
          exitOnRCLost: 'goContinue',
          executeRCLostAction: 'goBack',
          takeOffSecurityHeight: 20,
          takeOffRefPoint: '0.000000,0.000000,0.000000',
          takeOffRefPointAGLHeight: 0,
          globalTransitionalSpeed: 15,
          globalRTHHeight: 80,
          droneInfo: {
            droneEnumValue,
            droneSubEnumValue: droneModel[payloadEnumValue],
          },
          payloadInfo: {
            payloadEnumValue,
            payloadSubEnumValue: droneModel[payloadEnumValue],
            payloadPositionIndex: 0,
          },
        },
        Folder: {
          templateType: 'waypoint',
          useGlobalTransitionalSpeed: 0,
          templateId: 0,
          waylineCoordinateSysParam: {
            coordinateMode: 'WGS84',
            heightMode: 'EGM96',
            globalShootHeight: 50,
            positioningType: 'GPS',
            surfaceFollowModeEnable: 1,
            surfaceRelativeHeight: 100,
          },
          autoFlightSpeed: 7,
          gimbalPitchMode: 'usePointSetting',
          globalWaypointHeadingParam: {
            waypointHeadingMode: 'followWayline',
            waypointHeadingAngle: 0,
            waypointPoiPoint: '0.000000,0.000000,0.000000',
            waypointHeadingPathMode: 'followBadArc',
          },
          globalWaypointTurnMode: 'toPointAndStopWithDiscontinuityCurvature',
          globalUseStraightLine: 0,
          Placemark: [],
        },
      }
      template.value = templateJson
      return true
    } catch (error) {
      return error
    }
  }
  const save = () => {
    const JsZip = new JSZIP()
    const waylines = waylinesContext(template.value)
    const templateXml = JSONToXML(template.value, '', true)
    const waylinesWpml = JSONToXML(waylines, '', true)
    JsZip.file('wpmz/template.kml', templateXml)
    JsZip.file('wpmz/waylines.wpml', waylinesWpml)
    JsZip.generateAsync({ type: 'blob' }).then((blob) => {
      saveAs(blob, '新建航线.kmz')
    })
  }

  const generateXML = <T>(xmlJson: T) => {
    return JSONToXML(xmlJson)
  }

  const waylinesContext = (templateJson: any) => {
    const waylinesObj: { [key: string]: any } = {
      missionConfig: {
        flyToWaylineMode: null,
        finishAction: null,
        exitOnRCLost: null,
        executeRCLostAction: null,
        takeOffSecurityHeight: null,
        globalTransitionalSpeed: null,
        globalRTHHeight: null,
        droneInfo: null,
        payloadInfo: null,
      },
      Folder: {
        templateId: null,
        executeHeightMode: null,
        waylineId: null,
        autoFlightSpeed: null,
        Placemark: null,
      },
    }
    Object.keys(waylinesObj).forEach((key: string) => {
      if (Object.prototype.toString.call(waylinesObj[key]) === '[object Object]') {
        Object.keys(waylinesObj[key]).forEach((item) => {
          waylinesObj[key][item] = templateJson[key][item]
          if (item === 'executeHeightMode') {
            waylinesObj[key][item] = templateJson[key].waylineCoordinateSysParam.heightMode
          }
          if (item === 'waylineId') {
            waylinesObj[key][item] = templateJson[key].templateId
          }
          if (item === 'Placemark') {
            const placemarks = _.cloneDeep(templateJson[key][item])
            placemarks.forEach(
              (placemark: {
                executeHeight: { '#text': string }
                ellipsoidHeight?: { [x: string]: string }
                height?: { [x: string]: string }
              }) => {
                placemark.executeHeight = { '#text': placemark.ellipsoidHeight?.['#text'] || '' }
                delete placemark.ellipsoidHeight
                delete placemark.height
              },
            )
            waylinesObj[key][item] = placemarks
          }
        })
      } else {
        waylinesObj[key] = templateJson[key]
      }
    })
    return waylinesObj
  }

  // 将wpmz/template.kml解析传来json转换回去，重新复制以便于后续绘制
  watch(
    () => template.value,
    (newobj) => {
      const xmlString = JSONToXML(newobj)
      kmlStr.value = xmlString
    },
    {
      deep: true,
    },
  )

  return {
    init,
    create,
    save,
    generateXML,
  }
}

export { kmlStr, fileAuthor, template, waylines }
export default useKmzTsa
