package logic

import (
	"errors"
	"micro-bundle/internal/dao"
	"micro-bundle/internal/model"
	"micro-bundle/pb/bundle"
	"time"

	"dubbo.apache.org/dubbo-go/v3/common/logger"
	"github.com/jinzhu/copier"
	"github.com/samber/lo"
)

func BundleExtend(req *bundle.BundleExtendRequest) (*bundle.BundleExtendResponse, error) {
	data := model.BundleExtensionRecords{}
	if err := copier.CopyWithOption(&data, req, copier.Option{DeepCopy: true}); err != nil {
		return nil, err
	}
	if err := dao.AddBundleBalanceByUserId(model.BundleBalance{
		UserId:               int(req.UserId),
		VideoNumber:          int(req.VideoAdditional),
		ImageNumber:          int(req.ImagesAdditional),
		DataAnalysisNumber:   int(req.DataAdditional),
		AccountNumber:        int(req.AccountAdditional),
		ExpansionPacksNumber: 1,
	}); err != nil {
		return nil, errors.New("用户没有余量信息")
	}
	err := dao.AddBundleExtendRecord(data)
	if err != nil {
		logger.Error(err)
		return nil, errors.New("创建扩展记录失败")
	}
	return nil, nil
}

func BundleExtendRecordsList(req *bundle.BundleExtendRecordsListRequest) (*bundle.BundleExtendRecordsListResponse, error) {
	data, total, err := dao.GetBundleExtendRecordList(req)
	if err != nil {
		logger.Error(err)
		return nil, errors.New("查询失败")
	}
	resp := &bundle.BundleExtendRecordsListResponse{}
	resp.Total = total
	resp.Data = lo.Map(data, func(m model.BundleExtendRecordItemPo, _ int) *bundle.BundleExtendRecordItem {
		result := &bundle.BundleExtendRecordItem{}
		copier.Copy(result, &m)
		result.CreatedAt = uint64(m.CreatedAt.UnixMilli())
		return result
	})
	return resp, nil
}

func GetBundleBalanceList(req *bundle.GetBundleBalanceListReq) (*bundle.GetBundleBalanceListResp, error) {
	data, total, err := dao.GetBundleBalanceList(req)
	if err != nil {
		logger.Error(err)
		return nil, errors.New("查询失败")
	}
	resp := &bundle.GetBundleBalanceListResp{}
	resp.Total = total
	resp.Data = lo.Map(data, func(m model.BundleBalancePo, _ int) *bundle.BundleBalanceItem {
		result := &bundle.BundleBalanceItem{}
		copier.Copy(result, &m)
		loc, _ := time.LoadLocation("Asia/Shanghai")
		t, _ := time.ParseInLocation(time.DateTime, m.ExpirationTime, loc)
		if m.OrderUUID != "" {
			result.Bought = 2
		} else {
			result.Bought = 1
		}
		result.ExpiredTime = t.UnixMilli()
		return result
	})
	return resp, nil
}

func GetBundleBalanceByUserId(req *bundle.GetBundleBalanceByUserIdReq) (*bundle.GetBundleBalanceByUserIdResp, error) {
	data, err := dao.GetBundleBalanceByUserId(req)
	if err != nil {
		logger.Error(err)
		return nil, errors.New("查询失败")
	}
	result := &bundle.GetBundleBalanceByUserIdResp{}
	copier.Copy(result, &data)
	loc, _ := time.LoadLocation("Asia/Shanghai")
	t, _ := time.ParseInLocation(time.DateTime, data.ExpiredTime, loc)
	result.ExpiredTime = t.UnixMilli()
	t, _ = time.ParseInLocation(time.DateTime, data.PayTime, loc)
	result.PayTime = t.UnixMilli()
	return result, nil
}

func AddBundleBalance(req *bundle.AddBundleBalanceReq) (*bundle.AddBundleBalanceResp, error) {
	var data model.BundleBalance
	if err := copier.Copy(&data, req); err != nil {
		logger.Error(err)
		return nil, errors.New("操作失败")
	}
	return nil, dao.AddBundleBalanceByUserId(data)
}

func CreateBundleBalance(req *bundle.CreateBundleBalanceReq) (*bundle.CreateBundleBalanceResp, error) {
	var data model.BundleBalance
	if err := copier.Copy(&data, req); err != nil {
		logger.Error(err)
		return nil, errors.New("操作失败")
	}
	err := dao.CreateBundleBalance(data)
	if err != nil {
		logger.Error(err)
		return nil, errors.New("创建余量信息失败")
	}
	return nil, nil
}

func GetUsedRecord(req *bundle.GetUsedRecordListReq) (*bundle.GetUsedRecordListResp, error) {
	data, total, err := dao.GetUsedRecord(req)
	if err != nil {
		logger.Error(err)
		return nil, errors.New("查询失败")
	}
	resp := &bundle.GetUsedRecordListResp{}
	resp.Total = total
	resp.Data = lo.Map(data, func(m model.CostLog, _ int) *bundle.WorkCastItem {
		result := &bundle.WorkCastItem{}
		copier.Copy(result, &m)
		return result
	})
	return resp, nil
}

func GetImageWorkDetail(req *bundle.GetImageWorkDetailReq) (*bundle.GetImageWorkDetailResp, error) {
	data, err := dao.GetImageWorkDetail(req)
	if err != nil {
		logger.Error(err)
		return nil, errors.New("查询失败")
	}
	result := &bundle.GetImageWorkDetailResp{}
	err = copier.Copy(result, &data)
	return result, err
}

func GetVedioWorkDetail(req *bundle.GetVedioWorkDetailReq) (*bundle.GetVedioeWorkDetailResp, error) {
	data, err := dao.GetVedioWorkDetail(req)
	if err != nil {
		logger.Error(err)
		return nil, errors.New("查询失败")
	}
	result := &bundle.GetVedioeWorkDetailResp{}
	err = copier.Copy(result, &data)
	return result, err
}

func ToBeComfirmedWorks(req *bundle.ToBeComfirmedWorksReq) (*bundle.ToBeComfirmedWorksResp, error) {
	data, total, unconfirmed, err := dao.ToBeComfirmedWorks(req)
	if err != nil {
		logger.Error(err)
		return nil, errors.New("查询失败")
	}
	result := &bundle.ToBeComfirmedWorksResp{
		Total:       total,
		Unconfirmed: unconfirmed,
	}
	result.Data = lo.Map(data, func(m model.CastWorkLog, _ int) *bundle.WorkItem {
		result := &bundle.WorkItem{}
		copier.Copy(result, &m)
		return result
	})
	return result, nil
}

func ConfirmWork(req *bundle.ConfirmWorkReq) (*bundle.ConfirmWorkResp, error) {
	return nil, dao.ConfirmWork(req)
}