package models

import (
	"time"

	"github.com/google/uuid"
)

// CookieCategory represents a category of cookies
type CookieCategory struct {
	ID            uuid.UUID `json:"id" db:"id"`
	Name          string    `json:"name" db:"name"` // 'necessary', 'functional', 'analytics', 'marketing'
	DisplayNameDE string    `json:"display_name_de" db:"display_name_de"`
	DisplayNameEN *string   `json:"display_name_en" db:"display_name_en"`
	DescriptionDE *string   `json:"description_de" db:"description_de"`
	DescriptionEN *string   `json:"description_en" db:"description_en"`
	IsMandatory   bool      `json:"is_mandatory" db:"is_mandatory"`
	SortOrder     int       `json:"sort_order" db:"sort_order"`
	IsActive      bool      `json:"is_active" db:"is_active"`
	CreatedAt     time.Time `json:"created_at" db:"created_at"`
	UpdatedAt     time.Time `json:"updated_at" db:"updated_at"`
}

// CookieConsent represents a user's cookie preferences
type CookieConsent struct {
	ID          uuid.UUID `json:"id" db:"id"`
	UserID      uuid.UUID `json:"user_id" db:"user_id"`
	CategoryID  uuid.UUID `json:"category_id" db:"category_id"`
	Consented   bool      `json:"consented" db:"consented"`
	ConsentedAt time.Time `json:"consented_at" db:"consented_at"`
	UpdatedAt   time.Time `json:"updated_at" db:"updated_at"`
}

// CookieConsentRequest is the request body for setting cookie preferences
type CookieConsentRequest struct {
	Categories []CookieCategoryConsent `json:"categories" binding:"required"`
}

// CookieCategoryConsent represents consent for a single cookie category
type CookieCategoryConsent struct {
	CategoryID string `json:"category_id" binding:"required"`
	Consented  bool   `json:"consented"`
}

// CookieStats represents statistics about cookie consents
type CookieStats struct {
	Category       string  `json:"category"`
	TotalUsers     int     `json:"total_users"`
	ConsentedUsers int     `json:"consented_users"`
	ConsentRate    float64 `json:"consent_rate"`
}

// CreateCookieCategoryRequest is the request body for creating a cookie category
type CreateCookieCategoryRequest struct {
	Name          string  `json:"name" binding:"required"`
	DisplayNameDE string  `json:"display_name_de" binding:"required"`
	DisplayNameEN *string `json:"display_name_en"`
	DescriptionDE *string `json:"description_de"`
	DescriptionEN *string `json:"description_en"`
	IsMandatory   bool    `json:"is_mandatory"`
	SortOrder     int     `json:"sort_order"`
}

// ========================================
// Notification Models
// ========================================

// Notification represents a user notification
type Notification struct {
	ID        uuid.UUID  `json:"id" db:"id"`
	UserID    uuid.UUID  `json:"user_id" db:"user_id"`
	Type      string     `json:"type" db:"type"`       // 'new_version', 'consent_reminder', 'account_warning'
	Channel   string     `json:"channel" db:"channel"` // 'email', 'in_app', 'push'
	Title     string     `json:"title" db:"title"`
	Body      string     `json:"body" db:"body"`
	Data      *string    `json:"data,omitempty" db:"data"` // JSON string
	ReadAt    *time.Time `json:"read_at,omitempty" db:"read_at"`
	SentAt    *time.Time `json:"sent_at,omitempty" db:"sent_at"`
	CreatedAt time.Time  `json:"created_at" db:"created_at"`
}

// PushSubscription for Web Push notifications
type PushSubscription struct {
	ID        uuid.UUID `json:"id" db:"id"`
	UserID    uuid.UUID `json:"user_id" db:"user_id"`
	Endpoint  string    `json:"endpoint" db:"endpoint"`
	P256dh    string    `json:"p256dh" db:"p256dh"`
	Auth      string    `json:"auth" db:"auth"`
	UserAgent *string   `json:"user_agent,omitempty" db:"user_agent"`
	CreatedAt time.Time `json:"created_at" db:"created_at"`
}

// NotificationPreferences for user notification settings
type NotificationPreferences struct {
	ID                uuid.UUID `json:"id" db:"id"`
	UserID            uuid.UUID `json:"user_id" db:"user_id"`
	EmailEnabled      bool      `json:"email_enabled" db:"email_enabled"`
	PushEnabled       bool      `json:"push_enabled" db:"push_enabled"`
	InAppEnabled      bool      `json:"in_app_enabled" db:"in_app_enabled"`
	ReminderFrequency string    `json:"reminder_frequency" db:"reminder_frequency"` // 'daily', 'weekly', 'never'
	CreatedAt         time.Time `json:"created_at" db:"created_at"`
	UpdatedAt         time.Time `json:"updated_at" db:"updated_at"`
}

// SubscribePushRequest for subscribing to push notifications
type SubscribePushRequest struct {
	Endpoint string `json:"endpoint" binding:"required"`
	P256dh   string `json:"p256dh" binding:"required"`
	Auth     string `json:"auth" binding:"required"`
}

// UpdateNotificationPreferencesRequest for updating preferences
type UpdateNotificationPreferencesRequest struct {
	EmailEnabled      *bool   `json:"email_enabled"`
	PushEnabled       *bool   `json:"push_enabled"`
	InAppEnabled      *bool   `json:"in_app_enabled"`
	ReminderFrequency *string `json:"reminder_frequency"`
}
