package flash_express_pickup

import (
	"context"
	"github.com/UpmeshLTD/urus-aio/infrastructure/db/entities"
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
)

type Repository interface {
	Get(ctx context.Context, db *gorm.DB, ticketPickupID string) (*entities.FlashExpressPickup, error)
	GetByTrackingID(ctx context.Context, db *gorm.DB, courierTrackingID string) (*entities.FlashExpressPickup, error)
	Create(ctx context.Context, db *gorm.DB, entity *entities.FlashExpressPickup) error
	Delete(ctx context.Context, db *gorm.DB, id int64) error
}

type repositoryImpl struct {
}

func NewRepository() Repository {
	return &repositoryImpl{}
}

func (r repositoryImpl) Get(ctx context.Context, db *gorm.DB, ticketPickupID string) (*entities.FlashExpressPickup, error) {
	var res *entities.FlashExpressPickup
	err := db.Model(&entities.FlashExpressPickup{}).Preload(clause.Associations).Where("ticket_pickup_id = ?", ticketPickupID).First(&res).Error
	return res, err
}

func (r repositoryImpl) GetByTrackingID(ctx context.Context, db *gorm.DB, courierTrackingID string) (*entities.FlashExpressPickup, error) {
	var res *entities.FlashExpressPickup
	err := db.Model(&entities.FlashExpressPickup{}).Preload(clause.Associations).Where("? = ANY(courier_tracking_ids)", courierTrackingID).First(&res).Error
	return res, err
}

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

func (r *repositoryImpl) Delete(ctx context.Context, db *gorm.DB, id int64) error {
	return db.Where("id = ?", id).Delete(&entities.FlashExpressPickup{}).Error
}