package commands

import (
	"context"
	"fmt"
	"time"

	"github.com/iomodo/staff/tm"
	"github.com/spf13/cobra"
)

var createTaskCmd = &cobra.Command{
	Use:   "create-task [title]",
	Short: "Create a new task",
	Long: `Create a new task with specified title, description, and priority.

Examples:
  staff create-task "Add user authentication"
  staff create-task "Fix login bug" --description "Users cannot log in with Google OAuth" --priority high --assignee backend-engineer`,
	Args: cobra.ExactArgs(1),
	RunE: runCreateTask,
}

var (
	taskDescription string
	taskPriority    string
	taskAssignee    string
	taskDueDate     string
)

func init() {
	createTaskCmd.Flags().StringVarP(&taskDescription, "description", "d", "", "Task description")
	createTaskCmd.Flags().StringVarP(&taskPriority, "priority", "p", "medium", "Task priority (low, medium, high)")
	createTaskCmd.Flags().StringVarP(&taskAssignee, "assignee", "a", "", "Agent to assign the task to")
	createTaskCmd.Flags().StringVar(&taskDueDate, "due", "", "Due date (RFC3339 format, e.g., 2024-01-15T10:00:00Z)")
}

func runCreateTask(cmd *cobra.Command, args []string) error {
	title := args[0]
	
	// Validate priority
	priority := tm.TaskPriority(taskPriority)
	if priority != tm.PriorityLow && priority != tm.PriorityMedium && priority != tm.PriorityHigh {
		return fmt.Errorf("invalid priority: %s (must be low, medium, or high)", taskPriority)
	}

	// Parse due date if provided
	var dueDate *time.Time
	if taskDueDate != "" {
		parsed, err := time.Parse(time.RFC3339, taskDueDate)
		if err != nil {
			return fmt.Errorf("invalid due date format: %s (expected RFC3339)", taskDueDate)
		}
		dueDate = &parsed
	}

	// Create task request
	req := &tm.TaskCreateRequest{
		Title:       title,
		Description: taskDescription,
		OwnerID:     "user", // MVP: single user
		Priority:    priority,
		DueDate:     dueDate,
	}

	// Create the task
	task, err := taskManager.CreateTask(context.Background(), req)
	if err != nil {
		return fmt.Errorf("failed to create task: %w", err)
	}

	fmt.Printf("Task created successfully!\n")
	fmt.Printf("ID: %s\n", task.ID)
	fmt.Printf("Title: %s\n", task.Title)
	fmt.Printf("Priority: %s\n", task.Priority)
	fmt.Printf("Status: %s\n", task.Status)
	
	// Auto-assign if assignee is specified
	if taskAssignee != "" {
		task.Assignee = taskAssignee
		if err := taskManager.UpdateTask(task); err != nil {
			fmt.Printf("Warning: Failed to assign task to %s: %v\n", taskAssignee, err)
		} else {
			fmt.Printf("Assigned to: %s\n", taskAssignee)
		}
	}

	return nil
}