import { relations } from 'drizzle-orm';
import { pgTable,serial,char,pgEnum, primaryKey,integer,index,uniqueIndex,timestamp,unique, varchar, date, uuid } from 'drizzle-orm/pg-core';
import { project } from './project';
import { floor } from './floor';
import { areas } from './areas';
import { user } from './user';
import { z } from 'zod';
import { priorityType, taskStatus } from '@/server/task/domain/models';
export const status=pgEnum("status", taskStatus)
export const statusEnumSchema=z.enum(status.enumValues)
export const priority=pgEnum("priority", priorityType)
export const priorityEnumSchema=z.enum(priority.enumValues,{message:'Escoja una prioridad'})
export const task = pgTable("task", {
id: uuid("id").primaryKey().notNull(),
comments:varchar('comments',{length:255}).notNull(),
status:status('status').notNull().default('no iniciada'),
userId:varchar('user_id',{length:255}).references(()=>user.id,{onDelete:'cascade',onUpdate:'cascade'}),
startDate:date('start_date').notNull(),
expireDate:date('expire_date'),
startedTime:timestamp('started_time'),
endedTime:timestamp('ended_time'),
projectId:uuid('project_id').notNull().references(()=>project.id,{onDelete:'cascade',onUpdate:'cascade'}),
areaId:uuid('area_id').notNull().references(()=>areas.id,{onDelete:'cascade',onUpdate:'cascade'}),
areaName:varchar('area_name',{length:255}),
floorName:varchar('floor_name',{length:255}),
projectName:varchar('project_name',{length:255}),
priority:priority('priority').notNull(),
createdAT:timestamp('created_At').defaultNow(),
updatedAt:timestamp('updated_At').defaultNow().$onUpdate(()=>new Date())
},(t)=>{
return {
task_project:index('task_project').on(t.projectId),
task_area:index('task_area').on(t.areaId),
task_startDate:index('task_startDate').on(t.startDate),
task_expireDate:index('task_endDate').on(t.expireDate),
task_status:index('task_status').on(t.status),
task_user:index('task_user').on(t.userId),
}
});
export type TaskSelect = typeof task.$inferSelect;
export type TaskInsert = typeof task.$inferInsert;
export const taskRelations=relations(task,({one,many})=>({
project:one(project,{
fields:[task.projectId],
references:[project.id]
}),
user:one(user,{
fields:[task.userId],
references:[user.id]
}),
area:one(areas,{
fields:[task.areaId],
references:[areas.id]
})
}))