package repo

import (
	"context"

	"github.com/tidbcloud/devops/entity"
	"github.com/tidbcloud/devops/pkg/infra/utils/repoopt"
)

type repoImpl struct {
	driver   RemediationTicketDriver
	tadriver RemediationTicketApprovalDriver
}

func (r *repoImpl) QueryTicket(ctx context.Context, opts ...repoopt.Option) ([]*entity.RemediationTicket, error) {
	return r.driver.Query(ctx, opts...)
}

func (r *repoImpl) LoadTicket(ctx context.Context, id uint64) (*entity.RemediationTicket, error) {
	return r.driver.Load(ctx, id)
}

func (r *repoImpl) SaveTicket(ctx context.Context, ticket *entity.RemediationTicket) (uint64, error) {
	ticket, err := r.driver.Save(ctx, ticket)
	return ticket.ID, err
}

func (r *repoImpl) PatchTicket(ctx context.Context, ticket *entity.RemediationTicket) error {
	_, err := r.driver.Patch(ctx, ticket.ID, ticket)
	return err
}

func (r *repoImpl) FunctionalPatchTicket(ctx context.Context, current *entity.RemediationTicket, patch ...PatchRemediationTicket) error {
	for _, p := range patch {
		err := p(current)
		if err != nil {
			return err
		}
	}

	_, err := r.driver.Save(ctx, current)
	return err
}
func (r *repoImpl) QueryTicketLog(ctx context.Context, ticketId uint64) ([]*entity.RemediationTicketLog, error) {
	return nil, nil
}

func (r *repoImpl) CreateTicketLog(ctx context.Context, ticketLogItem *entity.RemediationTicketLog) error {
	return nil
}

func (r *repoImpl) SaveTicketPhaseApproval(ctx context.Context, ticketPhaseApproval *entity.RemediationTicketPhaseApproval) (uint64, error) {
	ta, err := r.tadriver.Save(ctx, ticketPhaseApproval)
	return ta.Id, err
}
func (r *repoImpl) QueryTicketPhaseApproval(ctx context.Context, opts ...repoopt.Option) ([]*entity.RemediationTicketPhaseApproval, error) {
	return r.tadriver.Query(ctx, opts...)
}

func (r *repoImpl) PatchTicketPhaseApproval(ctx context.Context, ticketPhaseApproval *entity.RemediationTicketPhaseApproval) error {
	_, err := r.tadriver.Patch(ctx, ticketPhaseApproval.Id, ticketPhaseApproval)
	return err
}

func (r *repoImpl) FunctionalPatchTicketPhaseApproval(ctx context.Context, current *entity.RemediationTicketPhaseApproval, patch ...PatchRemediationTicketApproval) error {
	for _, p := range patch {
		err := p(current)
		if err != nil {
			return err
		}
	}

	_, err := r.tadriver.Save(ctx, current)
	return err
}
