package dh_takephoto

/*
#include "takephoto.h"
*/
import "C"

import (
	"fmt"
	"unsafe"
)

// 图像类型
const (
	IMG_TYPE_BMP = 1 // 拍照输出"bmp"图像
	IMG_TYPE_JPG = 2 // 拍照输出"jpg"图像
)

// 图像水印
type SImgMark struct {
	CamModelName    string  // 相机型号名
	CamSerialNum    string  // 相机序列号
	ImgExposureTime float64 // 曝光时间值
	ImgWidth        uint    // 图像的宽度
	ImgHeight       uint    // 图像的高度
}

// 获取系统当前USBFS内存大小(MB), 成功返回: >=0, 失败返回: <0值
func getSysUsbfsMemCurrentSize() int {
	ret := int(C.DH_GetSysUsbfsMemCurrentSize())
	return ret
}

// 设置系统新的USBFS内存大小(MB), 成功返回: 0值, 失败返回: <0值
func setSysUsbfsMemSize(val int) int {
	setNewV := C.int(val)
	ret := int(C.DH_SetSysUsbfsMemSize(setNewV))
	return ret
}

// 获取当前已连接的大华相机的数量, 成功返回: >=0, 失败返回: <0值
func GetDHCameraCount() int {
	ret := int(C.DH_GetCameraCount())
	return ret
}

// 单次拍照时, 如果相机处于自动曝光模式, 是否等待曝光稳定后再拍照
// 参数: waitAE: 0=不等待, 1=等待(默认)
func SetWaitAEDoneForTakePhoto(waitAE int) int {
	ret := int(C.DH_SetWaitAEDoneForTakePhoto(C.int(waitAE)))
	return ret
}

// 单次执行相机拍照, 并保存到文件, 成功返回: 本次拍照图像的水印信息, 失败返回: 错误原因和空的水印信息
// 参数说明:
// "imgType"     - 图像保存类型: 1-".bmp", 2-".jpg"
// "saveImgPath" - 保存的文件名: 根据所选保存图像的类型, 程序会自动校检和处理文件的扩展名(智能)
// "timeout"     - 等待超时时间, 单位：秒: < 0 表示无超时; 无论超时怎么设置, 首次尝试拍照一定会
// 执行, 但时间不确定; 拍照成功、超时(相机持续无数据的时间)或发生错误时会自动结束任务.
func TakePhoto(imgType int, saveImgPath string, timeout int) (SImgMark, error) {
	if (imgType != IMG_TYPE_BMP && imgType != IMG_TYPE_JPG) || len(saveImgPath) == 0 {
		return SImgMark{}, fmt.Errorf("invalid arguments")
	}

	path := C.CString(saveImgPath)
	defer C.free(unsafe.Pointer(path))

	var imgMark C.DHImgMark
	ret := int(C.DH_TakePhoto(C.DHImgType(imgType), path, C.int(timeout), &imgMark))
	if ret != 0 {
		return SImgMark{}, fmt.Errorf("an error occurred while calling the C.DH_TakePhoto() function(%d)", ret)
	}

	return SImgMark{
		CamModelName:    C.GoString((*C.char)(unsafe.Pointer(&imgMark.camModelName[0]))),
		CamSerialNum:    C.GoString((*C.char)(unsafe.Pointer(&imgMark.camSerialNum[0]))),
		ImgExposureTime: float64(imgMark.imgExposureTime),
		ImgWidth:        uint(imgMark.imgWidth),
		ImgHeight:       uint(imgMark.imgHeight),
	}, nil
}
