package models

import (
	"time"

	"github.com/sujit-baniya/fiber-boilerplate/app"
	"gorm.io/gorm"
)

type Tarea struct {
	gorm.Model
	Titulo      string     `json:"titulo" gorm:"column:titulo;size:200"`
	Descripcion string     `json:"descripcion" gorm:"column:descripcion;type:text"`
	Estado      string     `json:"estado" gorm:"column:estado;default:'por_hacer';index"`
	Prioridad   string     `json:"prioridad" gorm:"column:prioridad;default:'media'"`
	AsignadoID  *uint      `json:"asignado_id" gorm:"column:asignado_id;index"`
	Asignado    *Users     `json:"asignado" gorm:"foreignKey:AsignadoID"`
	CreadoPorID uint       `json:"creado_por_id" gorm:"column:creado_por_id"`
	CreadoPor   *Users     `json:"creado_por" gorm:"foreignKey:CreadoPorID"`
	FechaLimite *time.Time `json:"fecha_limite" gorm:"column:fecha_limite"`
	Orden       int        `json:"orden" gorm:"column:orden;default:0"`
}

func (Tarea) TableName() string { return "tarea" }

type TareaComentario struct {
	ID        uint      `json:"id" gorm:"primaryKey;autoIncrement"`
	TareaID   uint      `json:"tarea_id" gorm:"column:tarea_id;index"`
	AutorID   uint      `json:"autor_id" gorm:"column:autor_id"`
	Autor     *Users    `json:"autor" gorm:"foreignKey:AutorID"`
	Contenido string    `json:"contenido" gorm:"column:contenido;type:text"`
	Archivos  string    `json:"archivos" gorm:"column:archivos;type:text"`
	CreatedAt time.Time `json:"created_at"`
}

func (TareaComentario) TableName() string { return "tarea_comentario" }

func GetAllTareas() ([]Tarea, error) {
	var items []Tarea
	err := app.Http.Database.DB.
		Preload("Asignado").
		Preload("CreadoPor").
		Order("estado ASC, orden ASC, created_at ASC").
		Find(&items).Error
	return items, err
}

func GetTareaByID(id uint) (*Tarea, error) {
	var t Tarea
	err := app.Http.Database.DB.
		Preload("Asignado").
		Preload("CreadoPor").
		First(&t, id).Error
	return &t, err
}

func CreateTarea(t *Tarea) error {
	return app.Http.Database.DB.Create(t).Error
}

func SaveTarea(t *Tarea) error {
	return app.Http.Database.DB.Save(t).Error
}

func DeleteTarea(id uint) error {
	return app.Http.Database.DB.Delete(&Tarea{}, id).Error
}

func CambiarEstadoTarea(id uint, estado string) error {
	return app.Http.Database.DB.Model(&Tarea{}).Where("id = ?", id).Update("estado", estado).Error
}

func GetComentariosByTarea(tareaID uint) ([]TareaComentario, error) {
	var items []TareaComentario
	err := app.Http.Database.DB.
		Preload("Autor").
		Where("tarea_id = ?", tareaID).
		Order("created_at ASC").
		Find(&items).Error
	return items, err
}

func CreateComentario(c *TareaComentario) error {
	return app.Http.Database.DB.Create(c).Error
}
