package webhook

import (
	"context"

	"github.com/UpmeshLTD/urus-aio/infrastructure/db/entities"
	"github.com/UpmeshLTD/urus-aio/shipment/db/gormdb"
	"github.com/UpmeshLTD/urus-aio/shipment/log"
)

type Repository interface {
	GetWebhookStatusLog(ctx context.Context, entity *entities.ShipmentStatusLog) (*entities.ShipmentStatusLog, error)
	CreateWebhookStatusLog(ctx context.Context, entity *entities.ShipmentStatusLog) error

	GetFlashExpressCourierWebhookLog(ctx context.Context, entity *entities.FlashExpressUpdateCourierWebhookLog) (*entities.FlashExpressUpdateCourierWebhookLog, error)
	CreateFlashExpressCourierWebhookLog(ctx context.Context, entity *entities.FlashExpressUpdateCourierWebhookLog) error
	CreateFlashExpressCourierWebhookLogs(ctx context.Context, entities []*entities.FlashExpressUpdateCourierWebhookLog) error
}

type repositoryImpl struct {
	db     gormdb.GormDB
	logger log.Logger
}

func NewRepository(db gormdb.GormDB, logger log.Logger) Repository {
	return &repositoryImpl{
		db:     db,
		logger: logger,
	}
}

func (r *repositoryImpl) GetWebhookStatusLog(ctx context.Context, entity *entities.ShipmentStatusLog) (*entities.ShipmentStatusLog, error) {
	var webhookLog *entities.ShipmentStatusLog
	if err := r.db.DB().Where(&entity).Order("state_date DESC").First(&webhookLog).Error; err != nil {
		return nil, err
	}
	return webhookLog, nil
}

func (r *repositoryImpl) CreateWebhookStatusLog(ctx context.Context, entity *entities.ShipmentStatusLog) error {
	return r.db.DB().Model(&entities.ShipmentStatusLog{}).Create(&entity).Error
}

func (r *repositoryImpl) GetFlashExpressCourierWebhookLog(ctx context.Context, entity *entities.FlashExpressUpdateCourierWebhookLog) (*entities.FlashExpressUpdateCourierWebhookLog, error) {
	var flCourierWebhookLog *entities.FlashExpressUpdateCourierWebhookLog
	if err := r.db.DB().Where(&entity).Find(&flCourierWebhookLog).Error; err != nil {
		return nil, err
	}
	return flCourierWebhookLog, nil
}

func (r *repositoryImpl) CreateFlashExpressCourierWebhookLog(ctx context.Context, entity *entities.FlashExpressUpdateCourierWebhookLog) error {
	return r.db.DB().Model(&entities.FlashExpressUpdateCourierWebhookLog{}).Create(entity).Error
}

func (r *repositoryImpl) CreateFlashExpressCourierWebhookLogs(ctx context.Context, courierWebhookLogs []*entities.FlashExpressUpdateCourierWebhookLog) error {
	return r.db.DB().Model(&entities.FlashExpressUpdateCourierWebhookLog{}).Create(courierWebhookLogs).Error
}
