<template>
	<view class="defaultStyles">
	</view>
</template>
<script lang="uts">
	/**
   * 引用 iOS 系统库
   * [可选实现，按需引入]
   */
	import {
		UIButton,
		UIControl
	} from "UIKit"
	
	/**
	 * 引入三方库
	 * [可选实现，按需引入]
	 *
	 * 在 iOS 平台引入三方库有以下两种方式：
	 * 1、通过引入三方库framework 或者.a 等方式，需要将 .framework 放到 ./Frameworks 目录下，将.a 放到 ./Libs 目录下。更多信息[详见](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#ios-平台原生配置)
	 * 2、通过 cocoaPods 方式引入，将要引入的 pod 信息配置到 config.json 文件下的 dependencies-pods 字段下。详细配置方式[详见](https://uniapp.dcloud.net.cn/plugin/uts-ios-cocoapods.html)
	 *
	 * 在通过上述任意方式依赖三方库后，使用时需要在文件中 import:
	 * 示例：import { LottieAnimationView, LottieAnimation, LottieLoopMode	} from 'Lottie'
	 */

	/**
	 * UTSiOS、UTSComponent 为平台内置对象，不需要 import 可直接调用其API，[详见](https://uniapp.dcloud.net.cn/uts/utsios.html)
	 */
	import { UTSComponent } from "DCloudUTSFoundation"
	import { LimeCamera } from './camera'
	//原生提供以下属性或方法的实现
	export default {
		data() {
			return {
			};
		},
		/**
		 * 组件名称，也就是开发者使用的标签
		 */
		name: "l-camera",
		/**
		 * 组件涉及的事件声明，只有声明过的事件，才能被正常发送
		 */
		emits: ['stop', 'error', 'initdone', 'ready', 'scancode', 'click', 'photoSuccess', 'recordSuccess'],
		
		/**
		 * 属性声明，组件的使用者会传递这些属性值到组件
		 */
		props: {
			"mode": {
				type: String,
				default: "normal"
			},
			"resolution": {
				type: String,
				default: "medium" // low | high
			},
			"devicePosition": {
				type: String,
				default: "back" // front前置 |back 后置
			},
			"flash": {
				type: String,
				default: "auto" // auto, on, off, torch
			},
			"frameSize": {
				type: String,
				default: "medium" // small|large
			},
			"focus": {
				type: Boolean,
				default: false
			}
		},
		/**
		 * 组件内部变量声明
		 */

		/**
		 * 属性变化监听器实现
		 */
		watch: {
			"devicePosition": {
				/**
				 * 这里监听属性变化，并进行组件内部更新
				 */
				handler(newValue : string, oldValue : string) {
					if (oldValue == newValue) return
					this.$el?.switchCamera(newValue)
				},
				immediate: false // 创建时是否通过此方法更新属性，默认值为false
			},
			"flash": {
				/**
				 * 这里监听属性变化，并进行组件内部更新
				 */
				handler(newValue : string, oldValue : string) {
					if (oldValue == newValue) return
					this.$el?.setFlash(newValue)
				},
				immediate: false // 创建时是否通过此方法更新属性，默认值为false

			},
			"focus": {
				/**
				 * 这里监听属性变化，并进行组件内部更新
				 */
				handler(newValue : boolean, oldValue : boolean) {
					if (oldValue == newValue) return
					this.$el?.setFocus(newValue)
				},
				immediate: false // 创建时是否通过此方法更新属性，默认值为false
			}
		},
		/**
		 * 规则：如果没有配置expose，则methods中的方法均对外暴露，如果配置了expose，则以expose的配置为准向外暴露
		 * ['publicMethod'] 含义为：只有 `publicMethod` 在实例上可用
		 */
		expose: ['takePhoto', 'setZoom', 'startRecord', 'stopRecord'],
		methods: {
			takePhoto() {
				this.$el?.takePhoto({
					success(res) {
						this.$emit('photoSuccess', res)
					},
					fail(err) {
						this.$emit('error', err)
						console.log('takePhoto err', err)
					}
				} as TakePhotoOption)
			},
			setZoom(zoom: number) {
				this.$el?.setZoom({
					zoom: zoom,
				} as CameraContextSetZoomOption)
			},
			startRecord() {
				this.$el?.startRecord({
					// selfieMirror: options.getBoolean('selfieMirror'),
					// timeout: options.getNumber('timeout'),
					success(res) {
						console.log('startRecord success', res)
					},
					fail(err) {
						console.log('startRecord err', err)
					}
				} as CameraContextStartRecordOption)
			},
			stopRecord() {
				this.$el?.stopRecord({
					success(res) {
						console.log('stopRecord success', res)
						this.$emit('recordSuccess', res)
					},
					fail(err) {
						console.log('stopRecord fail', err)
						this.$emit('error', err)
					},
				} as CameraContextStopRecordOption)
			},
		},
		/**
		 * 组件被创建，组件第一个生命周期，
		 * 在内存中被占用的时候被调用，开发者可以在这里执行一些需要提前执行的初始化逻辑
		 * [可选实现]
		 */
		created() {

		},
		/**
		 * 对应平台的view载体即将被创建，对应前端beforeMount
		 * [可选实现]
		 */
		NVBeforeLoad() {

		},
		/**
		 * 创建原生View，必须定义返回值类型
		 * 开发者需要重点实现这个函数，声明原生组件被创建出来的过程，以及最终生成的原生组件类型
		 * [必须实现]
		 */
		NVLoad() : LimeCamera {
			const view = new LimeCamera()
			view.comp = this
			return view
		},

		/**
		 * 原生View已创建
		 * [可选实现]
		 */
		NVLoaded() {
			/**
			 * 通过 this.$el 来获取原生控件。
			 */
			// camrea.setView(this.$el!)
		},
		/**
		 * 原生View布局完成
		 * [可选实现]
		 */
		NVLayouted() {

		},
		/**
		 * 原生View将释放
		 * [可选实现]
		 */
		NVBeforeUnload() { },
		/**
		 * 原生View已释放，这里可以做释放View之后的操作
		 * [可选实现]
		 */
		NVUnloaded() {
			this.$el?.unbindCamera()
		},
		/**
		 * 组件销毁
		 * [可选实现]
		 */
		unmounted() { }

		/**
		 * 更多组件开发的信息详见：https://uniapp.dcloud.net.cn/plugin/uts-component.html
		 */
	}

	/**
	 * 定义按钮点击后触发回调的类
	 * [可选实现]
	 */
	class ButtonClickListsner {
		/**
		 * 如果需要在回调类或者代理类中对组件进行操作，比如调用组件方法，发送事件等，需要在该类中持有组件对应的原生类的对象。
		 * 组件原生类的基类为 UTSComponent，该类是一个泛型类，需要接收一个类型变量，该类型变量就是原生组件的类型。
		 */
		private component : UTSComponent<UIButton>

		constructor(component : UTSComponent<UIButton>) {
			this.component = component
			super.init()
		}

		/**
		 * 按钮点击回调方法
		 * 在 swift 中，所有target-action (例如按钮的点击事件，NotificationCenter 的通知事件等)对应的 action 函数前面都要使用 @objc 进行标记。
		 * [可选实现]
		 */
		@objc buttonClickAction() {
			console.log("按钮被点击")
			// 发送事件
			this.component.__$$emit("buttonclick");
		}
	}

	/**
	 * 定义回调类或者代理类的实例
	 * [可选实现]
	 */
	let buttonClickListsner : ButtonClickListsner | null = null
</script>

<style>

</style>