package communitytokensdatabase

import (
	"database/sql"
	"fmt"

	"github.com/status-im/status-go/protocol/communities/token"
	"github.com/status-im/status-go/protocol/protobuf"
)

type Database struct {
	db *sql.DB
}

func NewCommunityTokensDatabase(db *sql.DB) *Database {
	return &Database{db: db}
}

func (db *Database) GetTokenType(chainID uint64, contractAddress string) (protobuf.CommunityTokenType, error) {
	var result = protobuf.CommunityTokenType_UNKNOWN_TOKEN_TYPE
	rows, err := db.db.Query(`SELECT type FROM community_tokens WHERE chain_id=? AND address=? LIMIT 1`, chainID, contractAddress)
	if err != nil {
		return result, err
	}
	defer rows.Close()

	if rows.Next() {
		err := rows.Scan(&result)
		return result, err
	}
	return result, fmt.Errorf("can't find token: chainId %v, contractAddress %v", chainID, contractAddress)
}

func (db *Database) GetTokenPrivilegesLevel(chainID uint64, contractAddress string) (token.PrivilegesLevel, error) {
	var result = token.CommunityLevel
	rows, err := db.db.Query(`SELECT privileges_level FROM community_tokens WHERE chain_id=? AND address=? LIMIT 1`, chainID, contractAddress)
	if err != nil {
		return result, err
	}
	defer rows.Close()

	if rows.Next() {
		err := rows.Scan(&result)
		return result, err
	}
	return result, fmt.Errorf("can't find privileges level: chainId %v, contractAddress %v", chainID, contractAddress)
}

func (db *Database) GetCommunityERC20Metadata() ([]*token.CommunityToken, error) {
	rows, err := db.db.Query(`SELECT community_id, address, name, symbol, chain_id FROM community_tokens WHERE type = ?`, protobuf.CommunityTokenType_ERC20)
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	var result []*token.CommunityToken
	for rows.Next() {
		token := token.CommunityToken{}
		err := rows.Scan(&token.CommunityID, &token.Address, &token.Name, &token.Symbol, &token.ChainID)
		if err != nil {
			return nil, err
		}
		result = append(result, &token)
	}
	return result, rows.Err()
}