package account

import (
	"gitea.frenchtouch.duckdns.org/kratisto/budget-backend/internal/storage/dao"
	"gitea.frenchtouch.duckdns.org/kratisto/budget-backend/internal/storage/model"
)

type Service struct {
	db *Database
}

func (s *Service) GetAllAccountOfUser(userId string) ([]*Account, error) {
	accounts, err := s.db.GetAllAccountOfUser(userId)
	if e, ok := err.(*dao.Error); ok {
		switch e.Type {
		case dao.ErrTypeNotFound:
			return nil, &model.ErrNotFound
		default:
			return nil, &model.ErrInternalServer
		}
	} else if err != nil {
		return nil, &model.ErrInternalServer
	}

	if accounts == nil {
		return nil, &model.ErrNotFound
	}
	return accounts, nil
}

func (s *Service) GetAccountWithNameForUser(name string, id string) (*Account, error) {
	account, err := s.db.GetAccountWithNameForUser(name, id)
	if e, ok := err.(*dao.Error); ok {
		switch e.Type {
		case dao.ErrTypeNotFound:
			return nil, &model.ErrNotFound
		default:
			return nil, &model.ErrInternalServer
		}
	} else if err != nil {
		return nil, &model.ErrInternalServer
	}
	return account, nil
}

func (s *Service) CreateAccount(account Account) (*Account, error) {
	err := s.db.CreateAccount(&account)
	return &account, err
}

func (s *Service) DeleteAccountOfUser(userId, accountId string) error {
	return s.db.DeleteAccountOfAnUser(userId, accountId)
}

func (s *Service) GetASpecificAccountForUser(userId, accountId string) (*Account, error) {
	return s.db.GetASpecificAccountForUser(userId, accountId)

}

func NewService(database *Database) *Service {
	return &Service{db: database}
}
