package dao

import (
	"errors"

	"github.com/fonchain/fonchain-artistinfo/cmd/model"
	db "github.com/fonchain/fonchain-artistinfo/pkg/db"
	"github.com/fonchain/fonchain-artistinfo/pkg/m"
	uuid "github.com/satori/go.uuid"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

func GetMgmtContractByArtistUid(artistUid string, contractType int32) (err error) {
	var contract model.Contract
	if err = db.DB.Where("artist_uid = ? AND type = ?", artistUid, contractType).First(&contract).Error; err != nil && err != gorm.ErrRecordNotFound {
		zap.L().Error("get contract info err", zap.Error(err))
		err = errors.New(m.ERROR_SELECT)
		return
	}

	return
}

func CreateArtistContract(tx *gorm.DB, contract *model.Contract) (err error) {
	if err = tx.Create(contract).Error; err != nil {
		zap.L().Error("create contract err", zap.Error(err))
		err = errors.New(m.CREATE_ERROR)
		return
	}
	return
}

func GetMgmtContractByArtworkUid(artworkUid string, artworkType int32) (err error) {
	//画作有合同类型是2，6的都是 点击过"著作权代理转让服务合同"的
	var contract model.Contract
	if err = db.DB.Where("artwork_uid = ? AND type = ?", artworkUid, 2).First(&contract).Error; err != nil && err != gorm.ErrRecordNotFound {
		zap.L().Error("get contract info err", zap.Error(err))
		err = errors.New(m.ERROR_SELECT)
		return
	}
	return
}

func CreateArtworkContract(tx *gorm.DB, artworkUid string, artistUid string, contractType int32) (err error) {
	var uid uuid.UUID
	if uid, err = uuid.NewV4(); err != nil {
		err = errors.New(m.ERROR_UID)
		return
	}

	contract := &model.Contract{
		Uid:        uid.String(),
		ArtistUid:  artistUid,
		ArtworkUid: artworkUid,
		Type:       contractType,
		State:      1,
	}
	if err = tx.Create(contract).Error; err != nil {
		zap.L().Error("create contract err", zap.Error(err))
		err = errors.New(m.CREATE_ERROR)
		return
	}

	return
}

// func FinishContract(tx *gorm.DB, id string) (contract model.Contract, err error) {
// 	if err = tx.Where("transaction_id = ?", id).First(&contract).Error; err != nil {
// 		zap.L().Error("get contract info err", zap.Error(err))
// 		err = errors.New(m.ERROR_SELECT)
// 		return
// 	}

// 	if err = db.DB.Model(&contract).Update("state", 3).Error; err != nil {
// 		zap.L().Error("user contract failed", zap.Error(err))
// 		err = errors.New(m.UPDATE_FAILED)
// 		return
// 	}

// 	return
// }

// func UpdateArtworkState(tx *gorm.DB, id int32) (err error) { //无用
// 	var artworkState model.ArtworkState
// 	if err = tx.Where("artwork_id = ? and state = ? ", id, 7).First(&artworkState).Error; err != nil {
// 		if err == gorm.ErrRecordNotFound {
// 			artworkState.ArtworkId = id
// 			artworkState.State = 7
// 			if err = tx.Create(&artworkState).Error; err != nil {
// 				zap.L().Error("create artworkState err", zap.Error(err))
// 				err = errors.New(m.CREATE_ERROR)
// 				return
// 			}
// 		} else {
// 			zap.L().Error("find artworkState info err", zap.Error(err))
// 			err = errors.New(m.ERROR_DATA_NOT_EXISTS)
// 			return
// 		}
// 	}

// 	if err = tx.Model(&model.Artwork{}).Where("id = ? ", id).Update("flow_state", 7).Error; err != nil {
// 		zap.L().Error("Artwork Update Err", zap.Error(err))
// 		err = errors.New(m.ERROR_DATA_NOT_EXISTS)
// 		return
// 	}

// 	return
// }

// func ContractList(req *contract.ContractListRequest) (rep *contract.ContractListRespond, err error) {
// 	rep = &contract.ContractListRespond{}
// 	var Data []*contract.ContractData

// 	var user model.User
// 	if err = db.DB.Where("id = ? ", req.ID).First(&user).Error; err != nil {
// 		zap.L().Error("get user info err", zap.Error(err))
// 		err = errors.New(m.ERROR_SELECT)
// 		return
// 	}

// 	var realName model.RealName
// 	if err = db.DB.Where("id = ? ", user.RealNameId).First(&realName).Error; err != nil {
// 		zap.L().Error("get realName info err", zap.Error(err))
// 		err = errors.New(m.ERROR_SELECT)
// 		return
// 	}

// 	var args []interface{}
// 	var sqlWhere = "user_id = ?  and type !=4 "
// 	args = append(args, req.ID)

// 	if req.State != 0 {
// 		sqlWhere += " and state = ? "
// 		if req.State == 2 {
// 			req.State = 3
// 		}
// 		args = append(args, req.State)
// 	}

// 	var contractModel []model.Contract
// 	if err = db.DB.Where(sqlWhere, args...).Find(&contractModel).Error; err != nil {
// 		zap.L().Error("get contractModels info err", zap.Error(err))
// 		err = errors.New(m.ERROR_SELECT)
// 		return
// 	}

// 	for _, v := range contractModel {
// 		contract := &contract.ContractData{}
// 		contract.ID = uint64(v.ID)
// 		contract.ContractId = v.ContractId
// 		contract.DownloadUrl = v.DownloadUrl
// 		contract.MgmtUserId = v.MgmtUserId
// 		contract.State = int64(v.State)
// 		contract.TransactionId = v.TransactionId
// 		contract.Type = int64(v.Type)
// 		contract.UserId = int64(v.UserId)
// 		contract.ViewUrl = v.ViewUrl
// 		contract.ExpirationTime = v.CreatedAt.Add(86400 * time.Second).Format("2006-01-02 15:04:05")
// 		contract.SignTime = v.UpdatedAt.Format("2006-01-02")
// 		Data = append(Data, contract)
// 	}

// 	rep.Data = Data

// 	return
// }

// func ContractTxList(req *contract.ContractTxListRequest) (rep *contract.ContractTxListRespond, err error) {
// 	rep = &contract.ContractTxListRespond{}
// 	var Data []*contract.ContractData

// 	var user model.User
// 	if err = db.DB.Where("id = ? ", int32(req.ID)).First(&user).Error; err != nil {
// 		zap.L().Error("get user info err", zap.Error(err))
// 		err = errors.New(m.ERROR_SELECT)
// 		return
// 	}
// 	// todo
// 	//var realName model.RealName
// 	//if err = db.DB.Where("id = ? ", user.RealNameID).First(&realName).Error; err != nil {
// 	//	zap.L().Error("get realName info err", zap.Error(err))
// 	//	err = errors.New(m.ERROR_SELECT)
// 	//	return
// 	//}
// 	//
// 	//var args []interface{}
// 	//var sqlWhere = "  card_id = ? and (type = 4 or type = 7) "
// 	//args = append(args, realName.IDNum)
// 	//if req.State != 0 {
// 	//	sqlWhere += " and state = ? "
// 	//	args = append(args, req.State)
// 	//}
// 	//
// 	//var contractModel []model.Contract
// 	//if err = db.DB.Where(sqlWhere, args...).Find(&contractModel).Error; err != nil {
// 	//	zap.L().Error("get contractModels info err", zap.Error(err))
// 	//	err = errors.New(m.ERROR_SELECT)
// 	//	return
// 	//}
// 	//
// 	//for _, v := range contractModel {
// 	//	contractTmp := &contract.ContractData{}
// 	//	contractTmp.ID = uint64(v.ID)
// 	//	contractTmp.ContractId = v.ContractId
// 	//	contractTmp.DownloadUrl = v.DownloadUrl
// 	//	contractTmp.MgmtUserId = v.MgmtUserId
// 	//	contractTmp.State = int64(v.State)
// 	//	contractTmp.TransactionId = v.TransactionId
// 	//	contractTmp.Type = int64(v.Type)
// 	//	var b string
// 	//	if v.Type == 4 {
// 	//		b = "物权"
// 	//	}
// 	//	if v.Type == 7 {
// 	//		b = "版权"
// 	//	}
// 	//	contractTmp.BatchName = b + v.BatchName[0:4] + "年" + v.BatchName[4:6] + "月" + v.BatchName[6:11] + "年" + v.BatchName[11:13] + "月"
// 	//	contractTmp.UserId = int64(v.UserId)
// 	//	contractTmp.ViewUrl = v.ViewUrl
// 	//	contractTmp.ExpirationTime = v.CreatedAt.Add(86400 * time.Second).Format("2006-01-02 15:04:05")
// 	//	contractTmp.SignTime = v.UpdatedAt.Format("2006-01-02")
// 	//	Data = append(Data, contractTmp)
// 	//}

// 	rep.Data = Data

// 	return
// }

// func GetContract(id int32) (rep *contract.ContractData, err error) {
// 	var con model.Contract
// 	if err = db.DB.Where("id = ? ", id).First(&con).Error; err != nil {
// 		zap.L().Error("get contract info err", zap.Error(err))
// 		err = errors.New(m.ERROR_SELECT)
// 		return
// 	}
// 	rep.ID = uint64(con.ID)
// 	rep.UserId = int64(con.UserId)
// 	rep.CardId = con.CardId
// 	rep.MgmtUserId = con.MgmtUserId
// 	rep.ArtworkId = con.ArtworkId
// 	rep.ContractId = con.ContractId
// 	rep.TransactionId = con.TransactionId
// 	rep.Type = int64(con.Type)
// 	rep.BatchName = con.BatchName
// 	rep.ViewUrl = con.ViewUrl
// 	rep.DownloadUrl = con.DownloadUrl
// 	rep.State = int64(con.State)

// 	return
// }

// // 更新交易id
// func UpdateContract(req *contract.UpdateContractRequest) error {
// 	//数据库操作异常
// 	var con model.Contract
// 	if err := db.DB.Model(&con).Updates(&model.Contract{ContractId: req.ContractId, ViewUrl: req.ViewUrl, DownloadUrl: req.DownloadUrl}).Error; err != nil {
// 		//在线和下载的链接
// 		return err
// 	}
// 	return nil
// }

// // 更新交易id
// func UpdateContractTx(txId string, contractId int32) (err error) {
// 	var con model.Contract
// 	con.ID = contractId
// 	if err = db.DB.Model(&con).Update("transaction_id", txId).Error; err != nil { //改变交易id
// 		return
// 	}
// 	if err = db.DB.Model(&con).Update("state", 1).Error; err != nil { //更新合约状态 // 1：待生成 2 待签署 3 签署完成
// 		return
// 	}
// 	return
// }
