package models

import (
	"time"

	"golang.org/x/crypto/bcrypt"
	"gorm.io/gorm"
)

type User struct {
	ID        uint           `json:"id" gorm:"primaryKey"`
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
	DeletedAt gorm.DeletedAt `json:"deleted_at" gorm:"index"`

	Email     string `json:"email" gorm:"uniqueIndex;not null"`
	Password  string `json:"-" gorm:"not null"` // Hidden from JSON
	FirstName string `json:"first_name" gorm:"not null"`
	LastName  string `json:"last_name" gorm:"not null"`
	Avatar    string `json:"avatar"`
	Role      string `json:"role" gorm:"default:'member'"` // admin, manager, member

	// Relationships
	Projects      []Project    `json:"projects" gorm:"many2many:project_members"`
	OwnedProjects []Project    `json:"owned_projects" gorm:"foreignKey:OwnerID"`
	Tasks         []Task       `json:"tasks" gorm:"foreignKey:AssignedToID"`
	Comments      []Comment    `json:"comments" gorm:"foreignKey:UserID"`
	FileUploads   []FileUpload `json:"file_uploads" gorm:"foreignKey:UploadedByID"`
}

// HashPassword hashes the user's password
func (u *User) HashPassword(password string) error {
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		return err
	}
	u.Password = string(hashedPassword)
	return nil
}

// CheckPassword checks if the provided password matches the user's password
func (u *User) CheckPassword(password string) bool {
	err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
	return err == nil
}

// GetFullName returns the user's full name
func (u *User) GetFullName() string {
	return u.FirstName + " " + u.LastName
}

// IsAdmin checks if the user has admin role
func (u *User) IsAdmin() bool {
	return u.Role == "admin"
}

// IsManager checks if the user has manager role or higher
func (u *User) IsManager() bool {
	return u.Role == "manager" || u.Role == "admin"
}
