import React, { useEffect, useRef, useState } from 'react';
import { DrawerForm, ProFormInstance, ProFormText, ProFormUploadButton, ProFormRadio, ProForm } from '@ant-design/pro-components';
import { message } from 'antd';
import Upload, { RcFile } from 'antd/es/upload';
import { Editor } from '@/components/Editor';

export type FormValueType = {
  target?: string;
  template?: string;
  type?: string;
  time?: string;
  frequency?: string;
} & Partial<API.PbcInnovativeService_>;

export type UpdateFormProps = {
  onCancel: (flag?: boolean, formVals?: FormValueType) => void;
  onSubmit: (values: FormValueType) => Promise<void>;
  updateModalVisible: boolean;
  values: Partial<API.PbcInnovativeService_>;
};

const UpdateForm: React.FC<UpdateFormProps> = (props) => {
  const formRef = useRef<ProFormInstance>();
  const [pbcType, setPbcType] = useState<number>(1);
  const [videoThumbnail, setVideoThumbnail] = useState<string>("");

  useEffect(() => {
    setPbcType(props.values.pbcType || 1)
    setVideoThumbnail(props.values.pbcThumbNail || "")
  }, [props.values.pbcId]);

  // 生成视频缩略图的函数
  const generateVideoThumbnail = async (videoUrl: string) => {
    try {
      // 创建视频元素
      const video = document.createElement('video');
      video.crossOrigin = 'anonymous';
      video.src = videoUrl;
      video.muted = true;
      
      // 监听视频加载完成事件
      await new Promise((resolve, reject) => {
        video.onloadeddata = resolve;
        video.onerror = reject;
        // 设置超时
        setTimeout(reject, 5000);
      });
      
      // 播放视频并暂停在第一帧
      video.currentTime = 0;
      await new Promise(resolve => {setTimeout(resolve, 200)});
      
      // 创建canvas并绘制视频帧
      const canvas = document.createElement('canvas');
      canvas.width = video.videoWidth;
      canvas.height = video.videoHeight;
      const ctx = canvas.getContext('2d');
      ctx?.drawImage(video, 0, 0, canvas.width, canvas.height);
      
      // 将canvas转为blob
      const blob = await new Promise<Blob>((resolve) => {
        canvas.toBlob((b) => resolve(b as Blob), 'image/jpeg', 0.95);
      });
      
      // 创建FormData并上传
      const formData = new FormData();
      formData.append('file', blob, 'thumbnail.jpg');
      
      // 发送请求上传缩略图
      const response = await fetch(`${process.env.BASE_URL}/oss/imgUpload`, {
        method: 'POST',
        headers: {
          authorization: localStorage.getItem('token') ?? '',
        },
        body: formData,
      });
      
      const result = await response.json();
      if (result.retcode) {
        setVideoThumbnail(result.data);
      }
    } catch (error) {
      console.error('生成视频缩略图失败:', error);
    }
  };

  return (
    <DrawerForm
      width={640}
      title={props.values.pbcId ? '编辑创新服务' : '新增创新服务'}
      open={props.updateModalVisible}
      formRef={formRef}
      onFinish={async (value: any) => {
        let pbcPicAddress = ""
        let pbcThumbNail = ""
        if (value.pbcType === 1 && value.pbcImage.length > 0) {
          pbcThumbNail = value.pbcImage[0].url || value.pbcImage[0].response.data;
          pbcPicAddress = value.pbcImage.map((e: any) => {
            return e.url || e.response.data;
          }).join(',');
        } else if (value.pbcType === 2 && value.pbcVideo.length > 0) {
          pbcPicAddress = value.pbcVideo[0].url || value.pbcVideo[0].response.data;
          pbcThumbNail = videoThumbnail;
        }
        return props.onSubmit({ ...value, pbcPicAddress, pbcThumbNail, pbcId: props.values.pbcId })
      }}
      drawerProps={{
        destroyOnClose: true,
      }}
      initialValues={{
        pbcTitle: props.values.pbcTitle,
        pbcType: props.values.pbcType || 1,
        pbcImage: props.values.pbcType === 1 && props.values.pbcPicAddress ? props.values.pbcPicAddress.split(',').map((e, index) => {
          return {
            uid: '-' + index,
            name: e.substring(e.lastIndexOf('/') + 1),
            status: 'done',
            url: e,
          }
        }) : [],
        pbcVideo: props.values.pbcType === 2 && props.values.pbcPicAddress ? [{
          uid: '-1',
          name: props.values.pbcPicAddress.substring(props.values.pbcPicAddress.lastIndexOf('/') + 1),
          status: 'done',
          url: props.values.pbcPicAddress,
        }] : [],
        pbcContent: props.values.pbcContent
      }}
      onOpenChange={(visible) => {
        formRef.current?.resetFields();
        if (!visible) {
          props.onCancel();
        }
      }}
    >
      <ProFormText
        placeholder={'请输入标题'}
        label="标题"
        rules={[
          {
            required: true,
            message: '标题为必填项',
          },
        ]}
        width="md"
        name="pbcTitle"
      />
      <ProFormRadio.Group
        name="pbcType"
        label="类型"
        options={[
          {
            label: '图片',
            value: 1,
          },
          {
            label: '视频',
            value: 2,
          },
        ]}
        rules={[
          {
            required: true,
            message: '请选择类型',
          },
        ]}
        fieldProps={{
          onChange: (e) => {
            setPbcType(e.target.value)
            formRef.current?.setFieldValue('pbcImage', []);
            formRef.current?.setFieldValue('pbcVideo', []);
          },
        }}
      />
      {pbcType === 1 ? <ProFormUploadButton
        label="上传图片"
        name="pbcImage"
        max={9}
        fieldProps={{
          name: 'file',
          accept: 'image/*',
          multiple: true,
          headers: {
            authorization: localStorage.getItem('token') ?? '',
          },
          onChange: (info: any) => {
            switch (info.file.status) {
              case 'done':
                if (info.file.response.retcode === 0) {
                  message.error(info.file.response.retmsg);
                  formRef.current?.setFieldValue('pbcImage', [])
                }
                break;
              default:
                break;
            }
          },
          action: process.env.BASE_URL + '/oss/imgUpload',
          beforeUpload(file: RcFile) {
            const isLt10M = file.size / 1024 / 1024 < 10;
            if (!isLt10M) {
              message.error('图片大小不能超过10MB!');
            }
            return isLt10M || Upload.LIST_IGNORE;
          },
          onPreview: async (file) => {
            if (file.uid.includes('-')) {
              window.open(file.url);
            }
            if (file.response && file.response.retcode) {
              window.open(file.response.data);
            }
          },
          listType: 'picture-card',
        }}
        rules={[
          { required: true, message: '请上传图片' },
        ]}
      /> :
      <ProFormUploadButton
        label="上传视频"
        name="pbcVideo"
        max={1}
        fieldProps={{
          name: 'file',
          accept: 'video/mp4',
          multiple: true,
          headers: {
            authorization: localStorage.getItem('token') ?? '',
          },
          onChange: (info: any) => {
            switch (info.file.status) {
              case 'done':
                if (info.file.response.retcode === 0) {
                  message.error(info.file.response.retmsg);
                  formRef.current?.setFieldValue('pbcVideo', [])
                } else if (info.file.response && info.file.response.retcode) {
                  // 视频上传成功后，获取视频首帧作为缩略图
                  const videoUrl = info.file.response.data;
                  generateVideoThumbnail(videoUrl);
                }
                break;
              default:
                break;
            }
          },
          action: process.env.BASE_URL + '/oss/imgUpload',
          beforeUpload(file: RcFile) {
            const isLt30M = file.size / 1024 / 1024 < 30;
            if (!isLt30M) {
              message.error('视频大小不能超过30MB!');
            }
            return isLt30M || Upload.LIST_IGNORE;
          },
          onPreview: async (file) => {
            if (file.uid === '-1') {
              window.open(file.url);
            }
            if (file.response && file.response.retcode) {
              window.open(file.response.data);
            }
          },
          listType: 'picture-card',
        }}
        rules={[
          { required: true, message: '请上传视频' },
        ]}
      />}
      <ProForm.Item
        name="pbcContent"
        label="创新服务内容"
        rules={[
          {
            required: true,
            message: '创新服务内容为必填项',
          },
        ]}
      >
        <Editor />
      </ProForm.Item>
    </DrawerForm>
  );
};

export default UpdateForm;