package controller

import (
	"context"
	"errors"
	"fonchain-artshow/cmd/model"
	"fonchain-artshow/cmd/service"
	"fonchain-artshow/pb/artShow"
	"fonchain-artshow/pkg/m"
)

type ArtShowProvider struct {
	artShow.UnimplementedArtShowServer
}

func (p *ArtShowProvider) CreateShow(ctx context.Context, req *artShow.SaveShowReq) (res *artShow.SaveShowRes, err error) {
	if req.ShowName == "" {
		err = errors.New(m.ERROR_SHOW_NAME)
		return nil, err
	}
	if req.ShowTime == "" {
		err = errors.New(m.ERROR_TIME)
		return nil, err
	}
	res = new(artShow.SaveShowRes)
	err, showID := service.CreateArtShowWithArtworkPrice(req)
	if err != nil {
		res.Msg = err.Error()
		err = errors.New(m.ERROR_CREATE)
		return res, err
	}
	res.Msg = m.CREATE_SUCCESS
	res.ShowID = int64(showID)
	return res, nil
}

func (p *ArtShowProvider) UpdateShow(ctx context.Context, req *artShow.SaveShowReq) (res *artShow.SaveShowRes, err error) {
	if req.ID == 0 {
		err = errors.New(m.ERROR_INVALID_ID)
		return
	}
	res = new(artShow.SaveShowRes)
	if req.IsShow == m.ARTSHOW_INSIDE {
		showRel := new(model.ShowRel)
		err, showRel = service.QueryShowRel(uint(req.ID))
		if err != nil {
			return res, err
		}
		if showRel.ID > 0 {
			err = errors.New(m.ERROR_NOT_UPDATE_ISSHOW)
			return
		}
	}

	err, showID := service.UpdateArtShowWithArtworkPrice(req)
	if err != nil {
		res.Msg = err.Error()
		err = errors.New(m.UPDATE_FAILED)
		return
	}
	res.Msg = m.UPDATE_SUCCESS
	res.ShowID = int64(showID)
	return
}

func (p *ArtShowProvider) DelShow(ctx context.Context, req *artShow.DelShowReq) (res *artShow.CommonRes, err error) {
	if len(req.ShowID) < 1 {
		err = errors.New(m.ERROR_INVALID_ID)
		return
	}
	err = service.DelArtShow(req)
	if err != nil {
		res.Msg = err.Error()
		err = errors.New(m.ERROR_DELETE)
		return
	}
	res.Msg = m.DELETE_SUCCESS
	return
}

func (p *ArtShowProvider) ShowList(ctx context.Context, req *artShow.ShowListReq) (res *artShow.ShowListRes, err error) {
	if req.Page == 0 {
		req.Page = 1
	}
	if req.PageSize == 0 {
		req.Page = 10
	}
	res = new(artShow.ShowListRes)
	err, res = service.ArtShowList(req)
	if err != nil {
		res.Msg = err.Error()
		err = errors.New(m.ERROR_QUERY)
		return
	}
	return
}

func (p *ArtShowProvider) ShowInfo(ctx context.Context, req *artShow.ShowDetailReq) (res *artShow.ShowArtworkDetailRes, err error) {
	err, res = service.ShowInfo(req)
	if err != nil {
		res.Msg = err.Error()
		err = errors.New(m.ERROR_QUERY)
		return
	}
	return
}

func (p *ArtShowProvider) ShowStatisticalInfo(ctx context.Context, req *artShow.ShowStatisticalInfoReq) (res *artShow.ShowStatisticalInfoRes, err error) {
	res = new(artShow.ShowStatisticalInfoRes)
	err, num := service.ShowStatisticalInfo(req)
	if err != nil {
		res.Msg = err.Error()
		err = errors.New(m.ERROR_Statistical_NUM)
		return
	}
	res.Data = num
	return
}

func (p *ArtShowProvider) ArtworkPrice(ctx context.Context, req *artShow.ArtworkPriceReq) (res *artShow.ArtworkPriceRes, err error) {
	if req.ArtworkID == 0 {
		err = errors.New(m.ERROR_INVALID_ID)
		return
	}
	res = new(artShow.ArtworkPriceRes)
	err, res = service.ArtworkPriceInfo(req)
	if err != nil {
		res.Msg = err.Error()
		err = errors.New(m.ERROR_QUERY)
		return
	}
	return
}

func (p *ArtShowProvider) ShowListWithApply(ctx context.Context, req *artShow.ShowListReq) (res *artShow.ShowListRes, err error) {
	if req.Page == 0 {
		req.Page = 1
	}
	if req.PageSize == 0 {
		req.Page = 10
	}
	if req.IsShow == 0 {
		req.IsShow = 2
	}
	res = new(artShow.ShowListRes)
	err, res = service.ArtShowListWithApply(req)
	if err != nil {
		res.Msg = err.Error()
		err = errors.New(m.ERROR_QUERY)
		return
	}
	return
}