package logic

import (
	"errors"

	"github.com/fonchain/fonchain-artistinfo/cmd/internal/dao"
	"github.com/fonchain/fonchain-artistinfo/cmd/model"
	"github.com/fonchain/fonchain-artistinfo/pb/mgmtStatement"
	db "github.com/fonchain/fonchain-artistinfo/pkg/db"
	"github.com/fonchain/fonchain-artistinfo/pkg/m"
	uuid "github.com/satori/go.uuid"
)

type IMgmtStatement interface {
	AddBatchDetail(in *mgmtStatement.AddBatchDetailreq) (*mgmtStatement.AddBatchDetailres, error)
	UploadExcelOne(in *mgmtStatement.UploadExcelOnereq) (*mgmtStatement.UploadExcelOneres, error)
	UploadExcelTwo(in *mgmtStatement.UploadExcelTworeq) (*mgmtStatement.UploadExcelTwores, error)
	ArtistStatementList(in *mgmtStatement.ArtistStatementListreq) (*mgmtStatement.ArtistStatementListres, error)
	ArtStatementList(in *mgmtStatement.ArtStatementListreq) (*mgmtStatement.ArtStatementListres, error)
	ExportContract(in *mgmtStatement.ExportContractreq) (*mgmtStatement.ExportContractres, error)
	UpdateState(in *mgmtStatement.UpdateStatementreq) error
	CreateTxContract(in *mgmtStatement.CreateTxContractreq) (resp *mgmtStatement.CreateTxContractres, err error)
}

func NewMgmtStatement() IMgmtStatement {
	return &MgmtStatement{}
}

type MgmtStatement struct{}

//通过excel生成一条批次数据
func (a *MgmtStatement) AddBatchDetail(in *mgmtStatement.AddBatchDetailreq) (resp *mgmtStatement.AddBatchDetailres, err error) {
	resp = &mgmtStatement.AddBatchDetailres{}
	var uid uuid.UUID
	if uid, err = uuid.NewV4(); err != nil {
		err = errors.New(m.ERROR_UID)
		return
	}
	if err != nil {
		return nil, err
	}
	var data model.ArtworkTx
	data.Uid = uid.String()
	data.ArtistName = in.ArtistName
	data.ArtistUid = in.ArtistUid
	data.BatchTime = in.BatchTime
	data.StType = in.StType //对账单类型:1=版权 2=物权
	data.Status = 1         //对账单状态 1.未签署  2.已发送未签署  3.已签署
	if err = dao.AddBatchDetail(&data); err != nil {
		return
	}
	respData := &mgmtStatement.AddBatchRes{BatchUid: data.Uid}
	resp.Data = respData
	return
}

//生成一条对账单记录(附件一)
func (a *MgmtStatement) UploadExcelOne(in *mgmtStatement.UploadExcelOnereq) (resp *mgmtStatement.UploadExcelOneres, err error) {
	resp = &mgmtStatement.UploadExcelOneres{}
	var uid uuid.UUID
	if uid, err = uuid.NewV4(); err != nil {
		err = errors.New(m.ERROR_UID)
		return
	}
	if err != nil {
		return nil, err
	}
	var data model.ArtworkSoldTxDetail //物权版权的对账单

	sqlSelect := `select uid from artwork_tx where artistid = ? and batchtime = ?`
	var batchid string
	if err := db.DB.Raw(sqlSelect, data.ArtistUid, data.BatchTime).Find(&batchid).Error; err != nil {
		return nil, err
	}

	data.Uid = uid.String()
	data.BatchUid = batchid
	data.ArtworkName = in.ArtworkName
	data.ArtistName = in.ArtistName
	data.ArtistUid = in.ArtistUid
	data.TfNum = in.TfNum
	data.BatchTime = in.BatchTime
	data.GuaranteePrice = in.GuaranteePrice
	data.Ruler = in.Ruler
	data.MinPrice = in.MinPrice
	data.StType = in.StType //对账单类型:1=版权 2=物权
	if err = dao.UploadExcelOne(&data); err != nil {
		return
	}
	respData := &mgmtStatement.StatementAddRes{StatementUid: data.Uid}
	resp.Data = respData
	return
}

//生成一条对账单记录(附件二)
func (a *MgmtStatement) UploadExcelTwo(in *mgmtStatement.UploadExcelTworeq) (resp *mgmtStatement.UploadExcelTwores, err error) {
	resp = &mgmtStatement.UploadExcelTwores{}
	var uid uuid.UUID
	if uid, err = uuid.NewV4(); err != nil {
		err = errors.New(m.ERROR_UID)
		return
	}
	if err != nil {
		return nil, err
	}
	var data model.ArtworkSoldTxDetail //物权版权的对账单

	sqlSelect := `select uid from artwork_tx_batch where artistid = ? and batchtime = ?`
	var batchid string
	if err := db.DB.Raw(sqlSelect, data.ArtistUid, data.BatchTime).Find(&batchid).Error; err != nil {
		return nil, err
	}

	data.Uid = uid.String()
	data.BatchUid = batchid
	data.ArtworkName = in.ArtworkName
	data.ArtistName = in.ArtistName
	data.ArtistUid = in.ArtistUid
	data.TfNum = in.TfNum
	data.BatchTime = in.BatchTime
	data.Ruler = in.Ruler
	data.MinPrice = in.MinPrice
	data.StType = in.StType //对账单类型:1=版权 2=物权
	if err = dao.UploadExcelTwo(&data); err != nil {
		return
	}
	respData := &mgmtStatement.StatementAddRes{StatementUid: data.Uid}
	resp.Data = respData
	return
}

//画家对账单列表
func (a *MgmtStatement) ArtistStatementList(in *mgmtStatement.ArtistStatementListreq) (resp *mgmtStatement.ArtistStatementListres, err error) {
	resp = &mgmtStatement.ArtistStatementListres{}
	if in.Page < model.InitPage {
		in.Page = model.InitPage
	}
	if in.PageSize < 1 {
		in.PageSize = model.PageSize
	}
	var list []*model.ArtworkSoldTxDetail
	var count int64
	if list, count, err = dao.ArtistStatementList(in); err != nil {
		return
	}
	resp.Count = int32(count)
	resp.Page = in.Page
	resp.PageSize = in.PageSize
	for _, v := range list {
		temp := mgmtStatement.ArtistStatementListres_Info{}
		temp.ArtistName = v.ArtistName
		temp.ArtistUid = v.ArtistUid
		temp.BatchTime = v.BatchTime
		resp.Data = append(resp.Data, &temp)
	}
	return
}

//画作列表,根据画家和批次
func (a *MgmtStatement) ArtStatementList(in *mgmtStatement.ArtStatementListreq) (resp *mgmtStatement.ArtStatementListres, err error) {
	resp = &mgmtStatement.ArtStatementListres{}
	if in.Page < model.InitPage {
		in.Page = model.InitPage
	}
	if in.PageSize < 1 {
		in.PageSize = model.PageSize
	}
	var list []*model.ArtworkSoldTxDetail
	var count int64
	if list, count, err = dao.ArtStatementList(in); err != nil {
		return
	}
	resp.Count = int32(count)
	resp.Page = in.Page
	resp.PageSize = in.PageSize
	for _, v := range list {
		temp := mgmtStatement.ArtStatementListres_Info{}
		temp.ArtistName = v.ArtworkName
		temp.ArtistUid = v.ArtistUid
		temp.ArtworkName = v.ArtworkName
		temp.Ruler = v.Ruler
		temp.SaleNo = v.SaleNo
		temp.TfNum = v.TfNum
		temp.CompleteDate = v.CompleteDate
		temp.MinPrice = v.MinPrice
	}
	return
}

//更新对账单状态
func (a *MgmtStatement) UpdateState(in *mgmtStatement.UpdateStatementreq) (err error) {
	columns := map[string]interface{}{
		"status": in.Status, //状态
	}
	if err = dao.UpdateState(in.StatementUid, columns); err != nil {
		return
	}
	return
}

//导出合同
func (a *MgmtStatement) ExportContract(in *mgmtStatement.ExportContractreq) (resp *mgmtStatement.ExportContractres, err error) {
	resp = &mgmtStatement.ExportContractres{}
	if in.Page < model.InitPage {
		in.Page = model.InitPage
	}
	if in.PageSize < 1 {
		in.PageSize = model.PageSize
	}

	var list []*model.Contract
	var count int64
	if list, count, err = dao.ExportContract(in); err != nil {
		return
	}
	resp.Count = int32(count)
	for _, v := range list {
		temp := mgmtStatement.ExportContractres_Info{}
		temp.DownloadUrl = v.DownloadUrl
		temp.BatchTime = v.BatchTime
		temp.StType = v.StType
		temp.ViewUrl = v.ViewUrl
		temp.BatchUid = v.BatchUid
		temp.ArtistUid = v.ArtistUid
		resp.Data = append(resp.Data, &temp)
	}
	return
}

//生成合同
func (a *MgmtStatement) CreateTxContract(in *mgmtStatement.CreateTxContractreq) (resp *mgmtStatement.CreateTxContractres, err error) {
	resp = &mgmtStatement.CreateTxContractres{}

	var uid uuid.UUID
	if uid, err = uuid.NewV4(); err != nil {
		err = errors.New(m.ERROR_UID)
		return
	}
	if err != nil {
		return nil, err
	}

	var data model.Contract
	data.Uid = uid.String()
	data.ArtistUid = in.ArtistUid
	data.BatchTime = in.BatchTime
	data.BatchUid = in.BatchUid
	data.ContractId = in.ContractId
	data.StType = in.StType
	data.Status = 1
	data.DownloadUrl = in.DownloadUrl
	data.ViewUrl = in.ViewUrl
	data.CardId = in.CardId
	if err = dao.CreateTxContract(&data); err != nil {
		return
	}
	respData := &mgmtStatement.AddContractRes{BatchUid: data.Uid}
	resp.Data = respData
	return
}