package schema

import (
	"time"

	"github.com/uptrace/bun"
)

type Publisher struct {
	bun.BaseModel `bun:"table:publisher"`

	ID        string    `bun:"id,pk"`
	CreatedAt time.Time `bun:"created_date,nullzero,notnull,default:current_timestamp"`
	UpdatedAt time.Time `bun:"last_modified_date,nullzero,notnull,default:current_timestamp"`
	Version   int       `bun:"version,default:0"`
	Name      string    `bun:"name,unique:name"`
	WebLink   string    `bun:"weblink"`

	ParentPublisherID *string     `bun:"parent_publisher_id"`
	ParentPublisher   *Publisher  `bun:"rel:belongs-to,join:parent_publisher_id=id"`
	Imprints          []Publisher `bun:"rel:has-many,join:id=parent_publisher_id"`
	Comics            []Comic     `bun:"rel:has-many,join:id=publisher_id"`
}

type Comic struct {
	bun.BaseModel `bun:"table:comic"`

	ID           string    `bun:"id,pk"`
	CreatedAt    time.Time `bun:"created_date,nullzero,notnull,default:current_timestamp"`
	UpdatedAt    time.Time `bun:"last_modified_date,nullzero,notnull,default:current_timestamp"`
	Version      int       `bun:"version,default:0"`
	Title        string    `bun:"title,unique:title,notnull"`
	CurrentOrder bool      `bun:"current_order"`
	Completed    bool      `bun:"completed"`
	WebLink      string    `bun:"weblink"`

	PublisherID     *string          `bun:"publisher_id"`
	Publisher       *Publisher       `bun:"rel:belongs-to,join:publisher_id=id"`
	Issues          []Issue          `bun:"rel:has-many,join:id=comic_id"`
	StoryArcs       []StoryArc       `bun:"rel:has-many,join:id=comic_id"`
	TradePaperbacks []TradePaperback `bun:"rel:has-many,join:id=comic_id"`
	Volumes         []Volume         `bun:"rel:has-many,join:id=comic_id"`
	ComicWorks      []ComicWork      `bun:"rel:has-many,join:id=comic_id"`
}

type Artist struct {
	bun.BaseModel `bun:"table:artist"`

	ID        string    `bun:"id,pk"`
	CreatedAt time.Time `bun:"created_date,nullzero,notnull,default:current_timestamp"`
	UpdatedAt time.Time `bun:"last_modified_date,nullzero,notnull,default:current_timestamp"`
	Version   int       `bun:"version,default:0"`
	Name      string    `bun:"name,unique:title,notnull"`
	WebLink   string    `bun:"weblink"`
}

type Issue struct {
	bun.BaseModel `bun:"table:issue"`

	ID          string    `bun:"id,pk"`
	CreatedAt   time.Time `bun:"created_date,nullzero,notnull,default:current_timestamp"`
	UpdatedAt   time.Time `bun:"last_modified_date,nullzero,notnull,default:current_timestamp"`
	Version     int       `bun:"version,default:0"`
	InStock     bool      `bun:"in_stock"`
	IsRead      bool      `bun:"is_read"`
	IssueNumber string    `bu:"issue_number"`
	Title       string    `bun:"title"`
	PublishedOn time.Time `bun:"published_on"`
	ComicID     *string   `bun:"comic_id"`
	Comic       *Comic    `bun:"rel:belongs-to,join:comic_id=id"`
	StoryArcID  *string   `bun:"story_arc_id"`
	StoryArc    *StoryArc `bun:"rel:belongs-to,join:story_arc_id=id"`
	VolumeID    *string   `bun:"volume_id"`
	Volume      *Volume   `bun:"rel:belongs-to,join:volume_id=id"`
}

type StoryArc struct {
	bun.BaseModel `bun:"table:story_arc"`

	ID        string    `bun:"id,pk"`
	CreatedAt time.Time `bun:"created_date,nullzero,notnull,default:current_timestamp"`
	UpdatedAt time.Time `bun:"last_modified_date,nullzero,notnull,default:current_timestamp"`
	Version   int       `bun:"version,default:0"`
	Name      string    `bun:"name,unique:name,notnull"`
	ComicID   *string   `bun:"comic_id"`
	Comic     *Comic    `bun:"rel:belongs-to,join:comic_id=id"`
	VolumeID  *string   `bun:"volume_id"`
	Volume    *Volume   `bun:"rel:belongs-to,join:volume_id=id"`
}

type TradePaperback struct {
	bun.BaseModel `bun:"table:trade_paperback"`

	ID         string    `bun:"id,pk"`
	CreatedAt  time.Time `bun:"created_date,nullzero,notnull,default:current_timestamp"`
	UpdatedAt  time.Time `bun:"last_modified_date,nullzero,notnull,default:current_timestamp"`
	Version    int       `bun:"version,default:0"`
	Name       string    `bun:"name,unique:name,notnull"`
	IssueStart int       `bun:"issue_start"`
	IssueEnd   int       `bun:"issue_end"`
	ComicID    *string   `bun:"comic_id"`
	Comic      *Comic    `bun:"rel:belongs-to,join:comic_id=id"`
}

type Volume struct {
	bun.BaseModel `bun:"table:volume"`

	ID        string    `bun:"id,pk"`
	CreatedAt time.Time `bun:"created_date,nullzero,notnull,default:current_timestamp"`
	UpdatedAt time.Time `bun:"last_modified_date,nullzero,notnull,default:current_timestamp"`
	Version   int       `bun:"version,default:0"`
	Name      string    `bun:"name,unique:name,notnull"`
	ComicID   *string   `bun:"comic_id"`
	Comic     *Comic    `bun:"rel:belongs-to,join:comic_id=id"`
}

type WorkType struct {
	bun.BaseModel `bun:"table:worktype"`

	ID        string    `bun:"id,pk"`
	CreatedAt time.Time `bun:"created_date,nullzero,notnull,default:current_timestamp"`
	UpdatedAt time.Time `bun:"last_modified_date,nullzero,notnull,default:current_timestamp"`
	Version   int       `bun:"version,default:0"`
	Name      string    `bun:"name,unique:name,notnull"`
}

type ComicWork struct {
	bun.BaseModel `bun:"table:comic_work"`

	ID         string    `bun:"id,pk"`
	CreatedAt  time.Time `bun:"created_date,nullzero,notnull,default:current_timestamp"`
	UpdatedAt  time.Time `bun:"last_modified_date,nullzero,notnull,default:current_timestamp"`
	Version    int       `bun:"version,default:0"`
	ArtistID   *string   `bun:"artist_id"`
	Artist     *Artist   `bun:"rel:belongs-to,join:artist_id=id"`
	ComicID    *string   `bun:"comic_id"`
	Comic      *Comic    `bun:"rel:belongs-to,join:comic_id=id"`
	WorkTypeID *string   `bun:"work_type_id"`
	WorkType   *WorkType `bun:"rel:belongs-to,join:work_type_id=id"`
}
