package db

import "time"

const (
	OrganizationRoleOwner  = "owner"
	OrganizationRoleMember = "member"

	// OrganizationProfileAudiencePublic is visible to every visitor who can
	// open the organization profile. Member pins are deliberately separate so
	// organizations can have a useful internal profile without exposing it.
	OrganizationProfileAudiencePublic = "public"
	OrganizationProfileAudienceMember = "member"

	OrganizationInvitationRoleDirectMember = "direct_member"
	OrganizationInvitationRoleAdmin        = "admin"
)

// OrganizationMember represents a user's membership in an organization.
type OrganizationMember struct {
	OrganizationID uint   `gorm:"primaryKey"`
	Organization   User   `gorm:"foreignKey:OrganizationID"`
	UserID         uint   `gorm:"primaryKey;index:idx_organization_members_user"`
	User           User   `gorm:"foreignKey:UserID"`
	Role           string `gorm:"size:20;not null;default:'member'"`
	CreatedAt      time.Time
	UpdatedAt      time.Time
}

// OrganizationProfilePin is an explicitly curated repository shown on an
// organization profile. This is intentionally not inferred from stars or
// recent activity: GitHub organization profiles are owner-curated.
//
// A repository may be pinned once per audience. Position is dense and scoped
// to (organization, audience), which makes replacement atomic and predictable.
type OrganizationProfilePin struct {
	OrganizationID uint       `gorm:"primaryKey;uniqueIndex:idx_org_profile_pin_position"`
	Organization   User       `gorm:"foreignKey:OrganizationID"`
	RepositoryID   uint       `gorm:"primaryKey;uniqueIndex:idx_org_profile_pin_repo"`
	Repository     Repository `gorm:"foreignKey:RepositoryID"`
	Audience       string     `gorm:"size:16;not null;uniqueIndex:idx_org_profile_pin_position;uniqueIndex:idx_org_profile_pin_repo"`
	Position       uint       `gorm:"not null;uniqueIndex:idx_org_profile_pin_position"`
	CreatedAt      time.Time
	UpdatedAt      time.Time
}

// OrganizationInvitation represents a pending invitation for a user to join an organization.
type OrganizationInvitation struct {
	ID             uint       `gorm:"primaryKey;autoIncrement"`
	OrganizationID uint       `gorm:"uniqueIndex:idx_org_invitation"`
	Organization   User       `gorm:"foreignKey:OrganizationID"`
	InviteeID      uint       `gorm:"uniqueIndex:idx_org_invitation"`
	Invitee        User       `gorm:"foreignKey:InviteeID"`
	InviterID      uint       `gorm:"index"`
	Inviter        User       `gorm:"foreignKey:InviterID"`
	Role           string     `gorm:"size:20;not null;default:'direct_member'"`
	TeamIDsJSON    string     `gorm:"type:text"`
	ExpiresAt      *time.Time `gorm:"index"`
	CreatedAt      time.Time
	UpdatedAt      time.Time
}

// OutsideCollaborator represents a non-member user with direct repo access in an organization.
type OutsideCollaborator struct {
	OrganizationID uint `gorm:"primaryKey"`
	Organization   User `gorm:"foreignKey:OrganizationID"`
	UserID         uint `gorm:"primaryKey;index:idx_outside_collaborators_user"`
	User           User `gorm:"foreignKey:UserID"`
	CreatedAt      time.Time
	UpdatedAt      time.Time
}
