package timeslicequery

import (
	"context"
	"voucher/internal/biz/bo"
)

func (v *Query) wechatQuery(ctx context.Context, order *bo.OrderBo, useNum *int) error {

	if order.Status.IsExpired() {
		_, err := v.cmb.Notify(ctx, order)
		return err
	}

	status, err := v.wechatCpnRepo.Query(ctx, order)
	if err != nil {
		return err
	}

	if status.IsUse() {
		if err = v.queryUsed(ctx, order); err != nil {
			return err
		}
		*useNum += 1
	} else if status.IsExpired() {
		return v.queryExpired(ctx, order)
	}

	return nil
}

func (v *Query) queryUsed(ctx context.Context, order *bo.OrderBo) error {

	if order.Status.IsUse() {
		_, err := v.cmb.Notify(ctx, order)
		return err
	}

	if err := v.orderRepo.Used(ctx, order.ID); err != nil {
		return err
	}

	return v.notify(ctx, order)
}

func (v *Query) queryExpired(ctx context.Context, order *bo.OrderBo) error {

	if order.Status.IsExpired() {
		_, err := v.cmb.Notify(ctx, order)
		return err
	}

	if err := v.orderRepo.Expired(ctx, order.ID); err != nil {
		return err
	}

	return v.notify(ctx, order)
}

func (v *Query) querySuccess(ctx context.Context, order *bo.OrderBo) error {

	if order.Status.IsSuccess() {
		_, err := v.cmb.Notify(ctx, order)
		return err
	}

	if err := v.orderRepo.Available(ctx, order.ID); err != nil {
		return err
	}

	return v.notify(ctx, order)
}

func (v *Query) notify(ctx context.Context, order *bo.OrderBo) error {

	order, err := v.orderRepo.GetByID(ctx, order.ID)
	if err != nil {
		return err
	}

	if _, err = v.cmb.Notify(ctx, order); err != nil {
		return err
	}

	return nil
}
