package models

import (
	"time"
)

// NotificationPreference represents the notifications_notificationpreference table
type NotificationPreference struct {
	BaseModel
	UserID           uint `gorm:"column:user_id;uniqueIndex;not null" json:"user_id"`

	// Task notifications
	TaskDueSoon      bool `gorm:"column:task_due_soon;default:true" json:"task_due_soon"`
	TaskOverdue      bool `gorm:"column:task_overdue;default:true" json:"task_overdue"`
	TaskCompleted    bool `gorm:"column:task_completed;default:true" json:"task_completed"`
	TaskAssigned     bool `gorm:"column:task_assigned;default:true" json:"task_assigned"`

	// Residence notifications
	ResidenceShared  bool `gorm:"column:residence_shared;default:true" json:"residence_shared"`

	// Document notifications
	WarrantyExpiring bool `gorm:"column:warranty_expiring;default:true" json:"warranty_expiring"`

	// Summary notifications
	DailyDigest bool `gorm:"column:daily_digest;default:true" json:"daily_digest"`

	// Email preferences
	EmailTaskCompleted bool `gorm:"column:email_task_completed;default:true" json:"email_task_completed"`

	// Custom notification times (nullable, stored as UTC hour 0-23)
	// When nil, system defaults from config are used
	TaskDueSoonHour      *int `gorm:"column:task_due_soon_hour" json:"task_due_soon_hour" validate:"omitempty,min=0,max=23"`
	TaskOverdueHour      *int `gorm:"column:task_overdue_hour" json:"task_overdue_hour" validate:"omitempty,min=0,max=23"`
	WarrantyExpiringHour *int `gorm:"column:warranty_expiring_hour" json:"warranty_expiring_hour" validate:"omitempty,min=0,max=23"`
	DailyDigestHour      *int `gorm:"column:daily_digest_hour" json:"daily_digest_hour" validate:"omitempty,min=0,max=23"`

	// User timezone for background job calculations (IANA name, e.g., "America/Los_Angeles")
	// Auto-captured from X-Timezone header on API calls
	Timezone *string `gorm:"column:timezone;type:varchar(50)" json:"timezone"`
}

// TableName returns the table name for GORM
func (NotificationPreference) TableName() string {
	return "notifications_notificationpreference"
}

// NotificationType represents the type of notification
type NotificationType string

const (
	NotificationTaskDueSoon      NotificationType = "task_due_soon"
	NotificationTaskOverdue      NotificationType = "task_overdue"
	NotificationTaskCompleted    NotificationType = "task_completed"
	NotificationTaskAssigned     NotificationType = "task_assigned"
	NotificationResidenceShared  NotificationType = "residence_shared"
	NotificationWarrantyExpiring NotificationType = "warranty_expiring"
)

// Notification represents the notifications_notification table
type Notification struct {
	BaseModel
	UserID           uint             `gorm:"column:user_id;index;not null" json:"user_id"`
	User             User             `gorm:"foreignKey:UserID" json:"-"`
	NotificationType NotificationType `gorm:"column:notification_type;size:50;not null" json:"notification_type"`

	Title            string           `gorm:"column:title;size:200;not null" json:"title"`
	Body             string           `gorm:"column:body;type:text;not null" json:"body"`

	// Related object (optional)
	TaskID           *uint            `gorm:"column:task_id" json:"task_id"`
	// Task          *Task            `gorm:"foreignKey:TaskID" json:"task,omitempty"` // Uncomment when Task model is implemented

	// Additional data (JSON)
	Data             string           `gorm:"column:data;type:jsonb;default:'{}'" json:"data"`

	// Delivery tracking
	Sent             bool             `gorm:"column:sent;default:false" json:"sent"`
	SentAt           *time.Time       `gorm:"column:sent_at" json:"sent_at"`

	// Read tracking
	Read             bool             `gorm:"column:read;default:false" json:"read"`
	ReadAt           *time.Time       `gorm:"column:read_at" json:"read_at"`

	// Error handling
	ErrorMessage     string           `gorm:"column:error_message;type:text" json:"error_message,omitempty"`
}

// TableName returns the table name for GORM
func (Notification) TableName() string {
	return "notifications_notification"
}

// MarkAsRead marks the notification as read
func (n *Notification) MarkAsRead() {
	n.Read = true
	now := time.Now().UTC()
	n.ReadAt = &now
}

// MarkAsSent marks the notification as sent
func (n *Notification) MarkAsSent() {
	n.Sent = true
	now := time.Now().UTC()
	n.SentAt = &now
}

// APNSDevice represents iOS devices for push notifications
type APNSDevice struct {
	ID             uint      `gorm:"primaryKey" json:"id"`
	Name           string    `gorm:"column:name;size:255" json:"name"`
	Active         bool      `gorm:"column:active;default:true" json:"active"`
	UserID         *uint     `gorm:"column:user_id;index" json:"user_id"`
	User           *User     `gorm:"foreignKey:UserID" json:"-"`
	DeviceID       string    `gorm:"column:device_id;size:255" json:"device_id"`
	RegistrationID string    `gorm:"column:registration_id;uniqueIndex;size:255" json:"registration_id"`
	DateCreated    time.Time `gorm:"column:date_created;autoCreateTime" json:"date_created"`
}

// TableName returns the table name for GORM
func (APNSDevice) TableName() string {
	return "push_notifications_apnsdevice"
}

// GCMDevice represents Android devices for push notifications
type GCMDevice struct {
	ID               uint      `gorm:"primaryKey" json:"id"`
	Name             string    `gorm:"column:name;size:255" json:"name"`
	Active           bool      `gorm:"column:active;default:true" json:"active"`
	UserID           *uint     `gorm:"column:user_id;index" json:"user_id"`
	User             *User     `gorm:"foreignKey:UserID" json:"-"`
	DeviceID         string    `gorm:"column:device_id;size:255" json:"device_id"`
	RegistrationID   string    `gorm:"column:registration_id;uniqueIndex;size:255" json:"registration_id"`
	CloudMessageType string    `gorm:"column:cloud_message_type;size:3;default:'FCM'" json:"cloud_message_type"`
	DateCreated      time.Time `gorm:"column:date_created;autoCreateTime" json:"date_created"`
}

// TableName returns the table name for GORM
func (GCMDevice) TableName() string {
	return "push_notifications_gcmdevice"
}
