package taskboard

import (
	"context"
	"fmt"
	"time"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
)

func (txs TxStore) applyTaskStatusUpdate(ctx context.Context, tx coredb.Tx, workspaceID string, taskID string, actorMemberID string, currentStatus Status, desiredStatus Status, now time.Time) error {
	if err := validateStatusTransition(currentStatus, desiredStatus); err != nil {
		return err
	}
	if desiredStatus == StatusDone {
		if _, err := tx.Exec(ctx, `
UPDATE tasks
SET status = $2,
    completed_by_member_id = $3,
    completed_by_ref = $3,
    completed_at = $4,
    last_activity_at = $4,
    updated_at = $4
WHERE id = $1
	`, taskID, desiredStatus, actorMemberID, now); err != nil {
			return fmt.Errorf("update done task: %w", err)
		}
	} else {
		if _, err := tx.Exec(ctx, `
UPDATE tasks
SET status = $2,
    completed_by_member_id = NULL,
    completed_by_ref = NULL,
    completed_at = NULL,
    last_activity_at = $3,
    updated_at = $3
WHERE id = $1
	`, taskID, desiredStatus, now); err != nil {
			return fmt.Errorf("update task status: %w", err)
		}
	}
	if desiredStatus != StatusInReview {
		if err := supersedeActiveTaskReviews(ctx, tx, taskID, actorMemberID, now); err != nil {
			return err
		}
	}
	if desiredStatus == StatusInReview || desiredStatus == StatusDone {
		if err := txs.rollUpChildReviewsForParentTask(ctx, tx, workspaceID, taskID, actorMemberID, now); err != nil {
			return err
		}
	}
	if err := applyTaskTypedEventPlan(ctx, tx, taskTypedEventIntent(taskID, actorMemberID, taskEventStatusChanged, string(desiredStatus), now)); err != nil {
		return err
	}
	return nil
}
