# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2012-2015 OpenWrt.org
# Copyright (C) 2016-2017 LEDE project

include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/image.mk
DTS_TYPE:=mt7981-spim-nand-rfb
KDIR=$(KERNEL_BUILD_DIR)

BIN_FW:=$(BIN_DIR)/$(DTS_TYPE)-sysupgrade.bin
BUILD_FW:=$(BIN_FW)
define Build/sysupgrade-emmc
	rm -f $@.recovery
	mkfs.fat -C $@.recovery 3070

	./gen_$(SUBTARGET)_emmc_img.sh $@ \
		$(IMAGE_KERNEL) \
		$@.recovery \
		$(IMAGE_ROOTFS)
endef

# build squashfs-hashed
define Build/squashfs-hashed
	$(CP) $(ROOTFS/$(FILESYSTEMS)/$(DEVICE_NAME)) $(ROOTFS/$(FILESYSTEMS)/$(DEVICE_NAME))-hashed
	$(TOPDIR)/scripts/make-squashfs-hashed.sh \
		$(ROOTFS/$(FILESYSTEMS)/$(DEVICE_NAME))-hashed \
		$(STAGING_DIR_HOST) \
		$(TOPDIR) \
		$(ROOTFS/$(FILESYSTEMS)/$(DEVICE_NAME))-hashed-summary
	fdt-patch-dm-verify $(ROOTFS/$(FILESYSTEMS)/$(DEVICE_NAME))-hashed-summary \
		$(KDIR)/image-$(firstword $(DEVICE_DTS)).dtb $(KDIR)/image-sb-$(firstword $(DEVICE_DTS)).dtb \
		$(HASHED_BOOT_DEVICE)
endef

# build fw-ar-ver
get_fw_ar_ver = \
  $(if $(wildcard $(2)),$(shell rm -rf $(2))) \
  $(if $(wildcard $(1)),$(info $(shell $(STAGING_DIR_HOST)/bin/ar-tool fw_ar_table create_ar_conf $(1) $(2)))) \
  $(if $(wildcard $(2)),$(eval include $(2))) \
  $(if $(FW_AR_VER),$(info FW_AR_VER = $(FW_AR_VER)))

define Build/fw-ar-ver
	$(call get_fw_ar_ver,$(ANTI_ROLLBACK_TABLE),$(AUTO_AR_CONF))
endef

# build signed fit
define Build/fit-sign
	$(TOPDIR)/scripts/mkits.sh \
		-D $(DEVICE_NAME) \
		-o $@.its \
		-k $@ \
		$(if $(word 2,$(1)),-d $(word 2,$(1))) -C $(word 1,$(1)) \
		-a $(KERNEL_LOADADDR) \
		-e $(if $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \
		-c $(if $(DEVICE_DTS_CONFIG),$(DEVICE_DTS_CONFIG),"config-1") \
		-A $(LINUX_KARCH) \
		-v $(LINUX_VERSION) \
		$(if $(FIT_KEY_NAME),-S $(FIT_KEY_NAME)) \
		$(if $(FW_AR_VER),-r $(FW_AR_VER)) \
		$(if $(CONFIG_TARGET_ROOTFS_SQUASHFS),-R $(ROOTFS/squashfs/$(DEVICE_NAME)))
	PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) mkimage \
		-f $@.its \
		$(if $(FIT_KEY_DIR),-k $(FIT_KEY_DIR)) \
		-r \
		$@.new
	@mv $@.new $@
endef

# default all platform image(fit) build 
define Device/Default
  PROFILES = Default $$(DEVICE_NAME)
  KERNEL_NAME := Image
  KERNEL = kernel-bin | lzma | \
	fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb
  KERNEL_INITRAMFS = kernel-bin | lzma | \
	fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb
  FILESYSTEMS := squashfs
  DEVICE_DTS_DIR := $(DTS_DIR)
  IMAGES := sysupgrade.bin
  IMAGE/sysupgrade.bin := append-kernel | pad-to 128k | append-rootfs | \
	pad-rootfs | append-metadata
  FIT_KEY_DIR :=
  FIT_KEY_NAME :=
endef

include $(SUBTARGET).mk

define Image/BuildKernel
	$(STAGING_DIR_HOST)/bin/lzma e $(KDIR)/vmlinux $(KDIR)/$(IMG_PREFIX)-vmlinux.lzma
	#$(CP) $(LINUX_DIR)/arch/$(LINUX_KARCH)/boot/dts/$(M_DTB_DIR)/mt7981-spim-nand-rfb.dtb $(KDIR)/$(M_DTB_NAME).dtb
	#dd if=$(KDIR)/$(M_DTB_NAME).dtb of=$(KDIR)/$(IMG_PREFIX)-vmlinux.lzma.bin bs=131072 count=1 conv=sync
	dd if=$(KDIR)/$(IMG_PREFIX)-vmlinux.lzma of=$(KDIR)/$(IMG_PREFIX)-vmlinux.lzma.bin bs=131072 seek=1
	$(CP) $(KDIR)/$(IMG_PREFIX)-vmlinux.lzma.bin $(BIN_DIR)/$(IMG_PREFIX)-vmlinux.lzma.bin
endef

define Image/Build/squashfs
    $(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
endef

define Image/Build/TPLINK
	[ -e creat_merge_up_no_md5.sh ] && cp -r creat_merge_up_no_md5.sh $(BIN_DIR)/ ; \
	[ -e creat_merge_up_add_md5.sh ] && cp -r creat_merge_up_add_md5.sh $(BIN_DIR)/ ; \
	#cp -f $(TOPDIR)/tplink/configs/$(PRODUCT)/resources/* $(BIN_DIR)/ ; 
	cd $(BIN_DIR) && rm -f *.json ; \
	cd $(TOPDIR)/tplink/configs/$(PRODUCT)/resources/ ; \
	allfile=`find . -maxdepth 1 -type f | sed 's#.*/##'` ; \
	for temp_file in $$$${allfile} ; \
	do \
		cp -f $$$${temp_file} $(BIN_DIR)/ ; \
	done; \
	alldirs=`ls -d */` ; \
	for temp_dir in $$$${alldirs} ; \
	do \
		cd $$$${temp_dir} ; \
		allfile=`find . -maxdepth 1 -type f | sed 's#.*/##'` ; \
		for temp_file in $$$${allfile} ; \
		do \
			cp -f $$$${temp_file} $(BIN_DIR)/ ; \
		done; \
		cd ../ ; \
	done ; \

	rm -f $(TOPDIR)/tplink/configs/$(PRODUCT)/database/database.tar.gz
	if [ -d $(TOPDIR)/tplink/configs/$(PRODUCT)/database ]; then \
		tar -C $(TOPDIR)/tplink/configs/$(PRODUCT)/ -czf $(BIN_DIR)/database.tar.gz database/; \
		mv $(BIN_DIR)/database.tar.gz $(TOPDIR)/tplink/configs/$(PRODUCT)/database/; \
	fi;

	# generate wlan factory ubi to save wifi caldata and country name and so on.
	if [ -e $(TOPDIR)/tplink/configs/$(PRODUCT)/$(PRODUCT).wlan.config ] ; then \
		[ -d $(BIN_DIR)/wlan_factory_data ] || mkdir -p $(BIN_DIR)/wlan_factory_data ; \
		[ -d $(BIN_DIR)/wlan_factory_bk_data ] || mkdir -p $(BIN_DIR)/wlan_factory_bk_data ; \
		[ -f $(BIN_DIR)/wlan_factory_default.bin ] && cp -f $(BIN_DIR)/wlan_factory_default.bin $(BIN_DIR)/wlan_factory_data && cp -f $(BIN_DIR)/wlan_factory_default.bin $(BIN_DIR)/wlan_factory_bk_data ; \
		cd $(BIN_DIR) && \
		$(STAGING_DIR_HOST)/bin/mkfs.ubifs -F -m 2048 -e 124KiB -c 36 -r $(BIN_DIR)/wlan_factory_data -o wlan_factory_data.ubifs && \
		$(STAGING_DIR_HOST)/bin/mkfs.ubifs -F -m 2048 -e 124KiB -c 36 -r $(BIN_DIR)/wlan_factory_bk_data -o wlan_factory_bk_data.ubifs && \
		$(STAGING_DIR_HOST)/bin/ubinize -m 2048 -p 128KiB -o wlan_factory_data.ubi wlan_factory_data.cfg && \
		$(STAGING_DIR_HOST)/bin/ubinize -m 2048 -p 128KiB -o wlan_factory_bk_data.ubi wlan_factory_bk_data.cfg ; \
	fi;

	# generate config factory ubi
	if [ -d $(TOPDIR)/tplink/configs/$(PRODUCT)/resources/config_factory ] ; then \
		cp -rf  $(TOPDIR)/tplink/configs/$(PRODUCT)/resources/config_factory $(BIN_DIR)/ ; \
		rootfs_config=`sed -ne '/^[[:space:]]*$$$$/d; /^#/d; p' $(TARGET_DIR)/etc/sysupgrade.conf $(TARGET_DIR)/lib/upgrade/keep.d/*` ; \
		echo "rootfs_config:"$$$${rootfs_config} ; \
		cd $(BIN_DIR) ; \
		for file in config_factory*.cfg ; \
		do \
			base_name="$$$${file%.cfg}" ; \
			middle_name="$$$${base_name#config_factory_}" ; \
			echo "basename:"$$$${base_name}",middle_name:"$$$${middle_name} ; \
			[ -d $$$${base_name} ] || mkdir -p $$$${base_name} ; \
			for config_line in $$$${rootfs_config} ; \
			do \
				DIR="$$$${config_line%/*}" ; \
				mkdir -p $$$${base_name}$$$${DIR} ; \
				if [ -d $(TARGET_DIR)/$$$${config_line} ] ; then \
					cp -a $(TARGET_DIR)/$$$${config_line}/* $$$${base_name}$$$${config_line} ; \
				elif [ -f $(TARGET_DIR)/$$$${config_line} ] ; then \
					cp -a $(TARGET_DIR)/$$$${config_line} $$$${base_name}$$$${config_line} ; \
				fi ; \
			done ; \
			cp -rf config_factory/common/* $$$${base_name}/ ; \
			[ -e config_factory/special/$$$${middle_name} ] && cp -rf config_factory/special/$$$${middle_name}/* $$$${base_name}/ ; \
			$(STAGING_DIR_HOST)/bin/mkfs.ubifs -F -m 2048 -e 124KiB -c 160 -r $$$${base_name} -o $$$${base_name}.ubifs && \
			$(STAGING_DIR_HOST)/bin/ubinize -m 2048 -p 128KiB -o $$$${base_name}.ubi $$$${file} ; \
		done ; \
	fi;

	# generate agileconfig factory ubi to save flag.
	if [ -e $(TOPDIR)/tplink/configs/$(PRODUCT)/resources/agileconfig_default.tmp ] ; then \
		[ -d $(BIN_DIR)/agile_config ] || mkdir -p $(BIN_DIR)/agile_config ; \
		[ -f $(BIN_DIR)/agileconfig_default.tmp ] && cp -f $(BIN_DIR)/agileconfig_default.tmp $(BIN_DIR)/agile_config ; \
		cd $(BIN_DIR) && \
		$(STAGING_DIR_HOST)/bin/mkfs.ubifs -F -m 2048 -e 124KiB -c 160 -r $(BIN_DIR)/agile_config -o agile_config.ubifs && \
		$(STAGING_DIR_HOST)/bin/ubinize -m 2048 -p 128KiB -o agile_config.ubi agile_config.cfg ; \
	fi;

	cd $(BIN_DIR) && rm -f *_flash.bin *_nandflash.bin *_nandflash_noecc.bin *_up.bin *_ParitionTable.bin ; \
	judge_packaged_partiton_up=`find . -name 'packaged_partiton_up' -type f | sed 's#.*/##'` ; \
	all_model_json=`find . -name 'model*.json' -type f | sed 's#.*/##'` ; \
	if [ "$$$${judge_packaged_partiton_up}" == "packaged_partiton_up" ]; then \
		while read -r line ; \
		do \
			newline=`echo $$$${line} | sed 's/\r//'` ; \
			for temp_model_json in $$$${all_model_json} ; \
			do \
				$(STAGING_DIR_HOST)/bin/dkmgt_firmware_make -m $$$${temp_model_json} -c $$$${newline} ; \
			done ; \
		done < packaged_partiton_up ; \
	fi; \
	date_now=`date +%Y%m%d%H%M%S` ; \
	all_model_json=`find . -name 'model*.json' -type f | sed 's#.*/##'` ; \
	echo "######################################" ; \
	echo $$$${all_model_json} ; \
	for temp_model_json in $$$${all_model_json} ; \
	do \
		$(STAGING_DIR_HOST)/bin/dkmgt_firmware_make -b -m $$$${temp_model_json} -T $$$${date_now} ; \
	done; \
	echo "Building ECC Flash.bin, Please Waiting..."; \
	cd $(BIN_DIR) ; \
	all_up_bin=`find . -name '*_common*_up.bin' -type f | sed 's#.*/##'` ; \
	for temp_up_bin in $$$${all_up_bin} ; \
	do \
		common_up_image_prefix=`echo -n $$$${temp_up_bin} | sed "s#_common.*_up.bin##g"` ; \
		rm $$$${common_up_image_prefix}_flash.bin ; \
	done ; \
	all_flash_bin=`find . -name '*_flash.bin' -type f | sed 's#.*/##'` ; \
	for temp_flash_bin in $$$${all_flash_bin} ; \
	do \
		flash_image_prefix=`echo -n $$$${temp_flash_bin} | sed 's/_flash.bin//g'` ; \
		if [ "$$$$(getconf LONG_BIT)" == "32" ]; then \
			BCH32 e 2048 64 $$$${flash_image_prefix}_flash.bin $$$${flash_image_prefix}_nandflash.bin ; \
		else \
			BCH e 2048 64 $$$${flash_image_prefix}_flash.bin $$$${flash_image_prefix}_nandflash.bin >/dev/null 2>&1; \
		fi; \
		mv $$$${flash_image_prefix}_flash.bin $$$${flash_image_prefix}_nandflash_noecc.bin ; \
		soft_ver=`echo $$$${flash_image_prefix} | grep -o -P '[0-9]\.[0-9]\.[0-9]'`	; \
		soft_date=`echo $$$${flash_image_prefix} | grep -o -P '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'` ; \
		soft_time=`echo $$$${flash_image_prefix} | grep -o -P 'rel[0-9][0-9][0-9][0-9][0-9]' | grep -o -P '[0-9][0-9][0-9][0-9][0-9]'`	; \
		sub_dir="$$$${soft_ver} Build $$$${soft_date} Rel.$$$${soft_time}" ; \
		dirname=$(TOPDIR)/image/$(PRODUCT)/"$$$${sub_dir}" ; \
		if [ ! -d "$$$${dirname}" ];then \
			mkdir -p "$$$${dirname}" ; \
		fi ; \
		if [ -e makeParitionTable.sh ]; then \
			. makeParitionTable.sh ; \
			cp ParitionTable.bin $$$${flash_image_prefix}_ParitionTable.bin ; \
		fi; \
		cp -f $(BIN_DIR)/"$$$${flash_image_prefix}"*.bin "$$$${dirname}" ; \
		cp -f $(BIN_DIR)/*up.bin "$$$${dirname}" ; \
	done ; \
	IMAGE_LIST="merged_image_list" ; \
	[ -e $$$${IMAGE_LIST} ] && rm -rf "$$$${IMAGE_LIST}" ; \
	if [ -d $(TOPDIR)/tplink/configs/$(PRODUCT)/resources/dsl_upgrade ]; then \
		rm -rf dsl_upgrade ; \
		mkdir -p dsl_upgrade ; \
		cp -r $(TOPDIR)/tplink/configs/$(PRODUCT)/resources/dsl_upgrade/* $(BIN_DIR)/dsl_upgrade/ ; \
		echo "dsl" >> $$$${IMAGE_LIST} ; \
	fi; \
	if [ -e lte_region ]; then \
		while read -r line ; \
		do \
			rm -rf qfirehose_$$$${line}* ; \
			cp -r $(TOPDIR)/tplink/configs/$(PRODUCT)/resources/qfirehose_$$$${line}.zip $(BIN_DIR)/ ; \
			echo "lte_$$$${line}" >> $$$${IMAGE_LIST} ; \
			[ -d dsl_upgrade ] && echo "dsl_lte_$$$${line}" >> $$$${IMAGE_LIST} ; \
		done < lte_region ; \
	fi; \
	if [ -e $$$${IMAGE_LIST} ] ; then \
		echo "make merged image..." ; \
		all_common_up_bin=`find . -name '*_common_up.bin' -o -name '*_common_v[0-9]_up.bin' -type f | sed 's#.*/##'` ; \
		for temp_common_up_bin in $$$${all_common_up_bin} ; \
		do \
			while read -r line ; \
			do \
				sh ./creat_merge_up_no_md5.sh "$$$${temp_common_up_bin}" $$$${line} ; \
				$(STAGING_DIR_HOST)/bin/dkmgt_firmware_make -a md5_$$$${line}.bin -M no_md5_$$$${line}_up.bin ; \
				sh ./creat_merge_up_add_md5.sh "$$$${temp_common_up_bin}" $$$${line} ; \
			done < $$$${IMAGE_LIST} ; \
			[ -e lte_region ] && cp -f $(BIN_DIR)/*_lte_*_up.bin "$$$${dirname}" ; \
			[ -d dsl_upgrade ] && cp -f $(BIN_DIR)/*_dsl_up.bin "$$$${dirname}" ; \
			echo "make merged image success" ; \
		done ; \
	fi; \
	cd $(TOPDIR)/tplink/configs/$(PRODUCT)/resources/ ; \
	agile_config_flag=`find . -name 'agileconfig_default.tmp'` ; \
	if [ -n "$$$${agile_config_flag}" ] ; then \
		echo "$$$${dirname}" ; \
		cd "$$$${dirname}" ; \
		file_list=`ls ./ | grep up.bin` ; \
		echo "$$$${file_list}" ; \
		for i in $$$${file_list} ; \
		do \
			tmp_lte=`echo $$$${i} | grep lte` ; \
			tmp_dsl=`echo $$$${i} | grep dsl` ; \
			if [ -z "$$$${tmp_lte}" -a -z "$$$${tmp_dsl}" ] ; then \
				new_file=`echo $$$${i} | sed 's/up.bin/up_agc3300.bin/'` ; \
				mv "$$$${i}" "$$$${new_file}" ; \
			fi; \
		done ; \
	fi ;
endef

define Image/BuildKernel/Profile/emmc
	cp $(KDIR)/Image $(BIN_DIR)/$(IMG_PREFIX)-Image
	cp $(KDIR)/image-mt7986a-emmc-rfb.dtb $(BIN_DIR)/image-mt7986a-emmc-rfb.dtb
endef

define Image/Build
	$(call Image/Build/$(1),$(1))
ifeq ($(CONFIG_PACKAGE_dkmgt_emmc),y)
	$(call Image/BuildKernel/Profile/emmc)
	dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-root.$(1) bs=128k conv=sync	
else
	$(call Image/Build/TPLINK)
endif
endef


$(eval $(call BuildImage))
