// Code generated by sqlc. DO NOT EDIT.
// versions:
//   sqlc v1.20.0

package db

import (
	"database/sql"
	"database/sql/driver"
	"fmt"
	"time"

	"github.com/sqlc-dev/pqtype"
)

type CommentType string

const (
	CommentTypeStories   CommentType = "stories"
	CommentTypeNews      CommentType = "news"
	CommentTypeReviews   CommentType = "reviews"
	CommentTypeLocations CommentType = "locations"
)

func (e *CommentType) Scan(src interface{}) error {
	switch s := src.(type) {
	case []byte:
		*e = CommentType(s)
	case string:
		*e = CommentType(s)
	default:
		return fmt.Errorf("unsupported scan type for CommentType: %T", src)
	}
	return nil
}

type NullCommentType struct {
	CommentType CommentType `json:"comment_type"`
	Valid       bool        `json:"valid"` // Valid is true if CommentType is not NULL
}

// Scan implements the Scanner interface.
func (ns *NullCommentType) Scan(value interface{}) error {
	if value == nil {
		ns.CommentType, ns.Valid = "", false
		return nil
	}
	ns.Valid = true
	return ns.CommentType.Scan(value)
}

// Value implements the driver Valuer interface.
func (ns NullCommentType) Value() (driver.Value, error) {
	if !ns.Valid {
		return nil, nil
	}
	return string(ns.CommentType), nil
}

type LocationType string

const (
	LocationTypeBeach         LocationType = "beach"
	LocationTypeAmusementpark LocationType = "amusement park"
	LocationTypeCulinary      LocationType = "culinary"
	LocationTypeHikingCamping LocationType = "hiking / camping"
	LocationTypeOther         LocationType = "other"
)

func (e *LocationType) Scan(src interface{}) error {
	switch s := src.(type) {
	case []byte:
		*e = LocationType(s)
	case string:
		*e = LocationType(s)
	default:
		return fmt.Errorf("unsupported scan type for LocationType: %T", src)
	}
	return nil
}

type NullLocationType struct {
	LocationType LocationType `json:"location_type"`
	Valid        bool         `json:"valid"` // Valid is true if LocationType is not NULL
}

// Scan implements the Scanner interface.
func (ns *NullLocationType) Scan(value interface{}) error {
	if value == nil {
		ns.LocationType, ns.Valid = "", false
		return nil
	}
	ns.Valid = true
	return ns.LocationType.Scan(value)
}

// Value implements the driver Valuer interface.
func (ns NullLocationType) Value() (driver.Value, error) {
	if !ns.Valid {
		return nil, nil
	}
	return string(ns.LocationType), nil
}

type UserReportsType string

const (
	UserReportsTypeComments  UserReportsType = "comments"
	UserReportsTypeReviews   UserReportsType = "reviews"
	UserReportsTypeLocations UserReportsType = "locations"
	UserReportsTypeUsers     UserReportsType = "users"
	UserReportsTypeStories   UserReportsType = "stories"
)

func (e *UserReportsType) Scan(src interface{}) error {
	switch s := src.(type) {
	case []byte:
		*e = UserReportsType(s)
	case string:
		*e = UserReportsType(s)
	default:
		return fmt.Errorf("unsupported scan type for UserReportsType: %T", src)
	}
	return nil
}

type NullUserReportsType struct {
	UserReportsType UserReportsType `json:"user_reports_type"`
	Valid           bool            `json:"valid"` // Valid is true if UserReportsType is not NULL
}

// Scan implements the Scanner interface.
func (ns *NullUserReportsType) Scan(value interface{}) error {
	if value == nil {
		ns.UserReportsType, ns.Valid = "", false
		return nil
	}
	ns.Valid = true
	return ns.UserReportsType.Scan(value)
}

// Value implements the driver Valuer interface.
func (ns NullUserReportsType) Value() (driver.Value, error) {
	if !ns.Valid {
		return nil, nil
	}
	return string(ns.UserReportsType), nil
}

type ClientIp struct {
	ID          int32          `json:"id"`
	Ipv4        string         `json:"ipv4"`
	Ipv6        sql.NullString `json:"ipv6"`
	BannedAt    sql.NullTime   `json:"banned_at"`
	BannedUntil sql.NullTime   `json:"banned_until"`
	Reason      sql.NullString `json:"reason"`
	IsPermaban  sql.NullBool   `json:"is_permaban"`
	CreatedAt   sql.NullTime   `json:"created_at"`
	UpdatedAt   sql.NullTime   `json:"updated_at"`
}

type Comment struct {
	ID          int32         `json:"id"`
	SubmittedBy int32         `json:"submitted_by"`
	CommentOn   int32         `json:"comment_on"`
	CommentType CommentType   `json:"comment_type"`
	ReplyTo     sql.NullInt32 `json:"reply_to"`
	IsHide      sql.NullBool  `json:"is_hide"`
	CreatedAt   sql.NullTime  `json:"created_at"`
	UpdatedAt   sql.NullTime  `json:"updated_at"`
}

type Image struct {
	ID         int32     `json:"id"`
	ImageUrl   string    `json:"image_url"`
	UploadedBy int32     `json:"uploaded_by"`
	ImageType  string    `json:"image_type"`
	ImageOf    int32     `json:"image_of"`
	CreatedAt  time.Time `json:"created_at"`
	UpdatedAt  time.Time `json:"updated_at"`
}

type Location struct {
	ID             int32          `json:"id"`
	Address        string         `json:"address"`
	Name           string         `json:"name"`
	GoogleMapsLink sql.NullString `json:"google_maps_link"`
	LocationType   LocationType   `json:"location_type"`
	SubmittedBy    int32          `json:"submitted_by"`
	TotalVisited   sql.NullInt32  `json:"total_visited"`
	Thumbnail      sql.NullString `json:"thumbnail"`
	RegencyID      int16          `json:"regency_id"`
	IsDeleted      bool           `json:"is_deleted"`
	CreatedAt      sql.NullTime   `json:"created_at"`
	UpdatedAt      sql.NullTime   `json:"updated_at"`
	ApprovedBy     sql.NullInt32  `json:"approved_by"`
	ApprovedAt     sql.NullTime   `json:"approved_at"`
}

type LocationImage struct {
	ID         int32         `json:"id"`
	Url        string        `json:"url"`
	LocationID int32         `json:"location_id"`
	UploadedBy sql.NullInt32 `json:"uploaded_by"`
	CreatedAt  sql.NullTime  `json:"created_at"`
	UpdatedAt  sql.NullTime  `json:"updated_at"`
}

type Province struct {
	ID           int32        `json:"id"`
	ProvinceName string       `json:"province_name"`
	RegionID     int16        `json:"region_id"`
	CreatedAt    sql.NullTime `json:"created_at"`
	UpdatedAt    sql.NullTime `json:"updated_at"`
}

type Regency struct {
	ID          int32        `json:"id"`
	RegencyName string       `json:"regency_name"`
	ProvinceID  int16        `json:"province_id"`
	CreatedAt   sql.NullTime `json:"created_at"`
	UpdatedAt   sql.NullTime `json:"updated_at"`
}

type Region struct {
	ID         int32        `json:"id"`
	RegionName string       `json:"region_name"`
	CreatedAt  sql.NullTime `json:"created_at"`
	UpdatedAt  sql.NullTime `json:"updated_at"`
}

type Review struct {
	ID           int32         `json:"id"`
	SubmittedBy  int32         `json:"submitted_by"`
	Comments     string        `json:"comments"`
	Score        int16         `json:"score"`
	IsFromCritic bool          `json:"is_from_critic"`
	CostApprox   sql.NullInt32 `json:"cost_approx"`
	IsHided      bool          `json:"is_hided"`
	LocationID   int32         `json:"location_id"`
	CreatedAt    sql.NullTime  `json:"created_at"`
	UpdatedAt    sql.NullTime  `json:"updated_at"`
}

type Tag struct {
	ID          int32         `json:"id"`
	Name        string        `json:"name"`
	SubmittedBy int32         `json:"submitted_by"`
	TargetID    int32         `json:"target_id"`
	TagsType    string        `json:"tags_type"`
	ApprovedBy  sql.NullInt32 `json:"approved_by"`
}

type User struct {
	ID                  int32                 `json:"id"`
	Email               sql.NullString        `json:"email"`
	Username            string                `json:"username"`
	Password            string                `json:"password"`
	AvatarPicture       sql.NullString        `json:"avatar_picture"`
	GoogleSignInPayload sql.NullString        `json:"google_sign_in_payload"`
	BannedAt            sql.NullTime          `json:"banned_at"`
	BannedUntil         sql.NullTime          `json:"banned_until"`
	BanReason           sql.NullString        `json:"ban_reason"`
	IsPermaban          sql.NullBool          `json:"is_permaban"`
	IsAdmin             sql.NullBool          `json:"is_admin"`
	IsCritics           sql.NullBool          `json:"is_critics"`
	IsVerified          sql.NullBool          `json:"is_verified"`
	IsActive            sql.NullBool          `json:"is_active"`
	SocialMedia         pqtype.NullRawMessage `json:"social_media"`
	CreatedAt           sql.NullTime          `json:"created_at"`
	UpdatedAt           sql.NullTime          `json:"updated_at"`
}

type UserActivity struct {
	ID        int32          `json:"id"`
	TargetID  int32          `json:"target_id"`
	Target    string         `json:"target"`
	Action    string         `json:"action"`
	Link      sql.NullString `json:"link"`
	Comment   sql.NullString `json:"comment"`
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
}

type UserFollow struct {
	ID         int32     `json:"id"`
	FollowerID int32     `json:"follower_id"`
	FolloweeID int32     `json:"followee_id"`
	CreatedAt  time.Time `json:"created_at"`
	UpdatedAt  time.Time `json:"updated_at"`
}

type UserReport struct {
	ID           int32           `json:"id"`
	Message      string          `json:"message"`
	Date         time.Time       `json:"date"`
	ReportTarget int32           `json:"report_target"`
	ReportType   UserReportsType `json:"report_type"`
	SubmittedBy  int32           `json:"submitted_by"`
	CreatedAt    sql.NullTime    `json:"created_at"`
	UpdatedAt    sql.NullTime    `json:"updated_at"`
}

type UserSession struct {
	ID           int32        `json:"id"`
	IndexID      int64        `json:"index_id"`
	Username     string       `json:"username"`
	RefreshToken string       `json:"refresh_token"`
	UserAgent    string       `json:"user_agent"`
	ClientIp     string       `json:"client_ip"`
	IsBlocked    bool         `json:"is_blocked"`
	ExpiresAt    time.Time    `json:"expires_at"`
	CreatedAt    sql.NullTime `json:"created_at"`
}