package data

import (
	"database/sql"
	"errors"
)

var (
	ErrRecordNotFound                = errors.New("record not found")
	ErrChannelRecordAlreadyExists    = errors.New("channel already in database")
	ErrEditConflict                  = errors.New("edit conflict")
	ErrCommandRecordAlreadyExists    = errors.New("command already exists")
	ErrLastFMUserRecordAlreadyExists = errors.New("lastfm connection already set")
	ErrUserAlreadyExists             = errors.New("user already in database")
)

// struct Models wraps the models, making them callable
// as app.models.Channels.Get(login)
type Models struct {
	Channels interface {
		Insert(login, id string) error
		Get(login string) (*Channel, error)
		GetAll() ([]*Channel, error)
		GetJoinable() ([]string, error)
		Delete(login string) error
	}
	Users interface {
		Insert(login, twitchId string) error
		Get(login string) (*User, error)
		Check(twitchId string) (*User, error)
		SetLevel(login string, level int) error
		GetLevel(twitchId string) (int, error)
		SetLocation(twitchId, location string) error
		GetLocation(twitchId string) (string, error)
		SetLastFM(login, lastfmUser string) error
		GetLastFM(login string) (string, error)
		Delete(login string) error
	}
	Commands interface {
		Get(name string) (*Command, error)
		Insert(command *Command) error
		Update(command *Command) error
		SetLevel(name string, level int) error
		SetCategory(name, category string) error
		SetHelp(name, helptext string) error
		Delete(name string) error
	}
	Timers interface {
		Get(name string) (*Timer, error)
		GetIdentifier(name string) (string, error)
		Insert(timer *Timer) error
		Update(timer *Timer) error
		GetAll() ([]*Timer, error)
		Delete(name string) error
	}
	Uploads interface {
		Insert(twitchLogin, twitchID, twitchMessage, twitchChannel, filehoster, downloadURL, identifier string)
		UpdateUploadURL(identifier, uploadURL string)
	}
	CommandsLogs interface {
		Insert(twitchLogin, twitchId, twitchChannel, twitchMessage, commandName string, uLvl int, identifier, rawMsg string)
	}
	SentMessagesLogs interface {
		Insert(twitchChannel, twitchMessage, ctxCommandName, ctxUser, ctxUserID, ctxMsg, identifier, ctxRaw string)
	}
}

func NewModels(db *sql.DB) Models {
	return Models{
		Channels:         ChannelModel{DB: db},
		Users:            UserModel{DB: db},
		Commands:         CommandModel{DB: db},
		Timers:           TimerModel{DB: db},
		Uploads:          UploadModel{DB: db},
		CommandsLogs:     CommandsLogModel{DB: db},
		SentMessagesLogs: SentMessagesLogModel{DB: db},
	}
}