package service

import (
	"fmt"
	"fonchain-artshow/cmd/dao"
	"fonchain-artshow/cmd/model"
	"fonchain-artshow/pb/artShow"
	"fonchain-artshow/pkg/db"
	"fonchain-artshow/pkg/m"
	"fonchain-artshow/pkg/serializer"
	"log"
)

// 创建画展包申请
func CreateShowApply(in *artShow.SaveApplyReq) (err error, applyUID string) {
	showApply := serializer.BuildShowApply(in)
	err = dao.SaveShowApply(showApply)
	if err != nil {
		return
	}
	return err, showApply.ApplyUID
}

// 更新画展包申请 及 关联记录
func UpdateShowApplyWithShowRel(in *artShow.SaveApplyReq) (err error, applyUID string) {

	// 更新画展包申请
	showApply := serializer.BuildShowApply(in)
	tx, err := dao.UpdateShowApply(showApply)
	if err != nil {
		tx.Rollback()
		return
	}

	// 更新 关联的 画展包的状态 为 已展
	if len(in.Rel) > 0 {
		// 保存 新 show_rel
		newShowRelS := serializer.BuildShowRelM(in.Rel, showApply.ApplyUID)
		for i := 0; i < len(newShowRelS); i++ {
			log.Printf("%+v\n", newShowRelS[i])
			err, showRel := dao.QueryShowRel(newShowRelS[i].ApplyUID, newShowRelS[i].ShowUID)
			if err != nil {
				tx.Rollback()
				return err, showApply.ApplyUID
			}
			if showRel.ShowRelUID != "" {
				newShowRelS[i].ShowRelUID = showRel.ShowRelUID
			}
		}

		err, _ = dao.SaveShowRels(tx, newShowRelS)
		if err != nil {
			tx.Rollback()
			return err, showApply.ApplyUID
		}

		for i := 0; i < len(newShowRelS); i++ {
			// 更新 画展包状态  为 画展包的画展地址和时间 通过
			show := serializer.BuildArtShowIsShowM(newShowRelS[i].ShowUID, m.ARTSHOW_SALE_ADDRESS_PASS)
			err := dao.UpdateArtShow(tx, show)
			if err != nil {
				tx.Rollback()
				return err, showApply.ApplyUID
			}
		}
	}

	// 更新 取消关联的 画展包的状态 为 可展
	if len(in.DelRel) > 0 {
		del := make([]string, 0)
		for i := 0; i < len(in.DelRel); i++ {
			del = append(del, in.DelRel[i].ShowRelUID)

			// 更新 画展包状态  为 可展
			show := serializer.BuildArtShowIsShowM(in.DelRel[i].ShowUID, m.ARTSHOW_PASS)
			err := dao.UpdateArtShow(tx, show)
			if err != nil {
				tx.Rollback()
				return err, showApply.ApplyUID
			}
		}

		// 删除关联记录
		err = dao.DelShowRelWithUID(tx, del)
		if err != nil {
			tx.Rollback()
			return err, showApply.ApplyUID
		}
	}

	err = tx.Commit().Error
	return err, showApply.ApplyUID
}

// 更新画展包申请状态
func UpdateShowApplyStatus(in *artShow.UpdateApplyStatusReq) (err error) {
	showApply := &model.ShowApply{
		ApplyUID: in.ApplyUID,
		Status:   int(in.Status),
		Remark:   in.Remark,
	}
	tx, err := dao.UpdateShowApply(showApply)
	if err != nil {
		tx.Rollback()
		return
	}
	err = tx.Commit().Error
	return
}

// 查询画展包申请列表
func ShowApplyList(in *artShow.ApplyListReq) (err error, total int64, out []*artShow.ApplyDetail) {
	out = make([]*artShow.ApplyDetail, 0)
	err, total, applyList := dao.ShowApplyList(in)
	if err != nil {
		return
	}
	if len(applyList) > 0 {
		for i := 0; i < len(applyList); i++ {
			showApply := serializer.BuildShowApplyRes(applyList[i])
			out = append(out, showApply)
		}
	}
	return
}

// 查询画展包申请详情
func ShowApplyDetail(applyUID string) (err error, out *artShow.ApplyShowRes) {
	out = new(artShow.ApplyShowRes)

	err, showApply := dao.ShowApplyDetail(applyUID)
	if err != nil {
		return
	}
	out.Apply = serializer.BuildShowApplyRes(showApply)

	err, artShow := dao.ArtShowList_apply(applyUID)
	if err != nil {
		return
	}
	out.Show = serializer.BuildArtShowListRes(artShow)
	fmt.Println(out.Show)
	return
}

// 删除画展包申请记录
func DelApplyRelByApplyUID(in *artShow.DelApplyReq) (err error) {
	//tx, err := dao.DelShowApply(in)
	//if err != nil {
	//	tx.Rollback()
	//	return
	//}

	//  不删除 画展的画展包数量申请
	tx := db.DbArtShow.Begin()

	for i := 0; i < len(in.ApplyUID); i++ {
		err = dao.DelShowReWithApplyUID(tx, in.ApplyUID[i])
		if err != nil {
			tx.Rollback()
			return
		}

		queryShowRelErr, showRels := dao.QueryShowRelList(in.ApplyUID[i], "")
		if queryShowRelErr != nil {
			tx.Rollback()
			return queryShowRelErr
		}
		if len(showRels) > 0 {
			for i := 0; i < len(showRels); i++ {
				// 更新 画展包状态  为 可展
				show := serializer.BuildArtShowIsShowM(showRels[i].ShowUID, m.ARTSHOW_PASS)
				updateArtShowErr := dao.UpdateArtShow(tx, show)
				if updateArtShowErr != nil {
					tx.Rollback()
					return updateArtShowErr
				}
			}
		}
	}
	err = tx.Commit().Error
	return
}

// 查询画展包申请关联记录
func QueryShowRel_showUID(showUID string) (err error, out *model.ShowRel) {
	out = new(model.ShowRel)
	err, out = dao.QueryShowRel_showUID(showUID)
	if err != nil {
		return err, nil
	}
	return
}
