package metastore

import "time"

const AdminTagName = "admin"

type User struct {
	ID               string    `json:"id"`
	Username         string    `json:"username"`
	Email            string    `json:"email,omitempty"`
	PasswordHash     string    `json:"password_hash"`
	TagIDs           []string  `json:"tag_ids"`
	CreatedAt        time.Time `json:"created_at"`
	UpdatedAt        time.Time `json:"updated_at"`
	Disabled         bool      `json:"disabled"`
	MaxFileSizeBytes *int64    `json:"max_file_size_bytes,omitempty"`
	MaxBoxSizeBytes  *int64    `json:"max_box_size_bytes,omitempty"`
	MaxExpirySeconds *int64    `json:"max_expiry_seconds,omitempty"`
}

type Tag struct {
	ID          string         `json:"id"`
	Name        string         `json:"name"`
	Description string         `json:"description,omitempty"`
	CreatedAt   time.Time      `json:"created_at"`
	UpdatedAt   time.Time      `json:"updated_at"`
	Protected   bool           `json:"protected"`
	Permissions TagPermissions `json:"permissions"`
}

type TagPermissions struct {
	UploadAllowed          bool    `json:"upload_allowed"`
	AllowedExpirySeconds   []int64 `json:"allowed_expiry_seconds,omitempty"`
	MaxFileSizeBytes       *int64  `json:"max_file_size_bytes,omitempty"`
	MaxBoxSizeBytes        *int64  `json:"max_box_size_bytes,omitempty"`
	OneTimeDownloadAllowed bool    `json:"one_time_download_allowed"`
	ZipDownloadAllowed     bool    `json:"zip_download_allowed"`
	RenewableAllowed       bool    `json:"renewable_allowed"`
	RenewOnAccessSeconds   int64   `json:"renew_on_access_seconds,omitempty"`
	RenewOnDownloadSeconds int64   `json:"renew_on_download_seconds,omitempty"`
	AdminAccess            bool    `json:"admin_access"`
	AdminUsersManage       bool    `json:"admin_users_manage"`
	AdminSettingsManage    bool    `json:"admin_settings_manage"`
	AdminBoxesView         bool    `json:"admin_boxes_view"`
}

type Session struct {
	Token     string    `json:"token"`
	CSRFToken string    `json:"csrf_token"`
	UserID    string    `json:"user_id"`
	CreatedAt time.Time `json:"created_at"`
	ExpiresAt time.Time `json:"expires_at"`
}

type EffectivePermissions struct {
	UploadAllowed          bool
	AllowedExpirySeconds   []int64
	MaxFileSizeBytes       int64
	MaxBoxSizeBytes        int64
	MaxExpirySeconds       int64
	OneTimeDownloadAllowed bool
	ZipDownloadAllowed     bool
	RenewableAllowed       bool
	RenewOnAccessSeconds   int64
	RenewOnDownloadSeconds int64
	AdminAccess            bool
	AdminUsersManage       bool
	AdminSettingsManage    bool
	AdminBoxesView         bool
}

type BootstrapResult struct {
	AdminTag          Tag
	AdminUser         *User
	AdminLoginEnabled bool
}
