// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.

package model

import (
	"errors"
	"strings"

	"github.com/mattermost/focalboard/server/utils"
)

// BlockType represents a block type.
type BlockType string

const (
	TypeUnknown = "unknown"
	TypeBoard   = "board"
	TypeCard    = "card"
	TypeView    = "view"
	TypeText    = "text"
	TypeComment = "comment"
	TypeImage   = "image"
)

func (bt BlockType) String() string {
	return string(bt)
}

// BlockTypeFromString returns an appropriate BlockType for the specified string.
func BlockTypeFromString(s string) (BlockType, error) {
	switch strings.ToLower(s) {
	case "board":
		return TypeBoard, nil
	case "card":
		return TypeCard, nil
	case "view":
		return TypeView, nil
	case "text":
		return TypeText, nil
	case "comment":
		return TypeComment, nil
	case "image":
		return TypeImage, nil
	}
	return TypeUnknown, ErrInvalidBlockType{s}
}

// BlockType2IDType returns an appropriate IDType for the specified BlockType.
func BlockType2IDType(blockType BlockType) utils.IDType {
	switch blockType {
	case TypeBoard:
		return utils.IDTypeBoard
	case TypeCard:
		return utils.IDTypeCard
	case TypeView:
		return utils.IDTypeView
	case TypeText, TypeComment:
		return utils.IDTypeBlock
	}
	return utils.IDTypeNone
}

// ErrInvalidBlockType is returned wherever an invalid block type was provided.
type ErrInvalidBlockType struct {
	Type string
}

func (e ErrInvalidBlockType) Error() string {
	return e.Type + " is an invalid block type."
}

// IsErrInvalidBlockType returns true if `err` is a IsErrInvalidBlockType or wraps one.
func IsErrInvalidBlockType(err error) bool {
	var eibt *ErrInvalidBlockType
	return errors.As(err, &eibt)
}
