package apartment_usecase

import (
	"chonho/internal/api-v1/entity"
	"chonho/internal/api-v1/repository/apartment_repository"
	"chonho/pkg/model"
	"encoding/json"
)

type ApartmentUseCase interface {
	ListApartment() ([]entity.Apartment, error)
	GetApartment(id int64) (*entity.Apartment, error)
	CreateApartment(request *entity.CreateApartmentRequest) (*model.Apartment, error)
}

type useCase struct {
	apartmentRepo apartment_repository.ApartmentRepository
}

func NewApartmentUseCase(r apartment_repository.ApartmentRepository) *useCase {
	return &useCase{
		apartmentRepo: r,
	}
}

func (u *useCase) ListApartment() ([]entity.Apartment, error) {
	result, err := u.apartmentRepo.Find()
	return result, err
}

func (u *useCase) GetApartment(id int64) (*entity.Apartment, error) {
	result, err := u.apartmentRepo.Get(id)
	return result, err
}

func (u *useCase) CreateApartment(request *entity.CreateApartmentRequest) (*model.Apartment, error) {

	// encode to json string
	jsonBody, _ := json.Marshal(request)

	// decode from json string
	var apartment model.Apartment
	err := json.Unmarshal(jsonBody, &apartment)
	if err != nil {
		return nil, err
	}

	// save db
	err = u.apartmentRepo.Save(&apartment)
	if err != nil {
		return nil, err
	}

	// return result
	return &apartment, nil
}
