package model

import (
	"time"

	"gorm.io/gorm"
)

// contextKey is a custom type for context keys
type contextKey string

// ContextLanguageID is the key for storing language ID in context
const ContextLanguageID contextKey = "languageID"

type Translation struct {
	LangID      uint    `gorm:"primaryKey;column:lang_id"`
	ScopeID     uint    `gorm:"primaryKey;column:scope_id"`
	ComponentID uint    `gorm:"primaryKey;column:component_id"`
	Key         string  `gorm:"primaryKey;size:255;column:key"`
	Data        *string `gorm:"type:text;column:data"`

	Language  Language  `gorm:"foreignKey:LangID;references:ID;constraint:OnUpdate:RESTRICT,OnDelete:RESTRICT"`
	Scope     Scope     `gorm:"foreignKey:ScopeID;references:ID;constraint:OnUpdate:RESTRICT,OnDelete:RESTRICT"`
	Component Component `gorm:"foreignKey:ComponentID;references:ID;constraint:OnUpdate:RESTRICT,OnDelete:RESTRICT"`
}

func (Translation) TableName() string {
	return "b2b_translations"
}

type Language struct {
	ID              uint           `gorm:"primaryKey;autoIncrement;column:id"`
	CreatedAt       time.Time      `gorm:"not null;column:created_at"`
	UpdatedAt       *time.Time     `gorm:"column:updated_at"`
	DeletedAt       gorm.DeletedAt `gorm:"index:idx_language_deleted_at;column:deleted_at"`
	Name            string         `gorm:"size:128;not null;column:name"`
	ISOCode         string         `gorm:"size:2;not null;column:iso_code"`
	LangCode        string         `gorm:"size:5;not null;column:lang_code"`
	DateFormat      string         `gorm:"size:32;not null;column:date_format"`
	DateFormatShort string         `gorm:"size:32;not null;column:date_format_short"`
	RTL             bool           `gorm:"not null;default:0;column:rtl"`
	IsDefault       bool           `gorm:"not null;default:0;column:is_default;comment:there should be only one default language"`
	Active          bool           `gorm:"not null;default:1;column:active"`
	Flag            string         `gorm:"size:16;not null;column:flag"`
}

func (Language) TableName() string {
	return "b2b_language"
}

type Component struct {
	ID   uint64 `gorm:"primaryKey;autoIncrement;column:id"`
	Name string `gorm:"size:255;not null;uniqueIndex:uk_components_name;column:name"`
}

func (Component) TableName() string {
	return "b2b_components"
}

type Scope struct {
	ID   uint64 `gorm:"primaryKey;autoIncrement;column:id"`
	Name string `gorm:"size:255;not null;uniqueIndex:uk_scopes_name;column:name"`
}

func (Scope) TableName() string {
	return "b2b_scopes"
}
