// src/shared/contracts/tasks.ts
// Tasks contract - centralized types for tasks management

import { z } from 'zod';

// Position schema for grid layout
export const positionSchema = z.object({
  x: z.number(),
  y: z.number(),
  w: z.number(),
  h: z.number(),
});

// Task schema
export const taskSchema = z.object({
  id: z.string().uuid(),
  userId: z.string().uuid(),
  text: z.string(),
  isCompleted: z.boolean(),
  parentId: z.string().uuid().nullable(),
  position: positionSchema.nullable(),
  order: z.number().nullable(),
  createdAt: z.string(),
  updatedAt: z.string(),
});

// Create task input schema
export const createTaskInputSchema = z.object({
  text: z.string(),
  isCompleted: z.boolean().default(false),
  parentId: z.string().uuid().nullable().optional(),
  position: positionSchema.optional(),
  order: z.number().optional(),
});

// Update task input schema
export const updateTaskInputSchema = z.object({
  text: z.string().optional(),
  isCompleted: z.boolean().optional(),
  parentId: z.string().uuid().nullable().optional(),
  position: positionSchema.optional(),
  order: z.number().optional(),
});

// Update task positions schema (for grid layout)
export const updateTaskPositionsInputSchema = z.object({
  tasks: z.array(z.object({
    id: z.string().uuid(),
    position: positionSchema,
  })),
});

// Reorder tasks schema (for subtask reordering with hierarchy support)
export const reorderTasksInputSchema = z.object({
  rootId: z.string().uuid(), // ID карточки (root card) - явное указание корня
  tasks: z.array(z.object({
    id: z.string().uuid(),
    order: z.number(),
    parentId: z.string().uuid().nullable().default(null),
  })),
});

// Response schemas (payload-only - interceptor extracts from wrapper)
export const tasksListResponseSchema = z.array(taskSchema);

export const taskResponseSchema = taskSchema;

// Types
export type Position = z.infer<typeof positionSchema>;
export type Task = z.infer<typeof taskSchema>;
export type CreateTaskInput = z.infer<typeof createTaskInputSchema>;
export type UpdateTaskInput = z.infer<typeof updateTaskInputSchema>;
export type UpdateTaskPositionsInput = z.infer<typeof updateTaskPositionsInputSchema>;
export type ReorderTasksInput = z.infer<typeof reorderTasksInputSchema>;
