package controller

import (
	_const "chonho/const"
	"chonho/internal/api-v1/entity"
	"chonho/internal/api-v1/usecase/apartment_usecase"
	_error "chonho/pkg/c_error"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"strconv"
)

type ApartmentController struct {
	Controller
	apartmentUseCase apartment_usecase.ApartmentUseCase
}

func NewApartmentController(u apartment_usecase.ApartmentUseCase) *ApartmentController {
	return &ApartmentController{
		apartmentUseCase: u,
	}
}

// ListApartment godoc
// @Summary Get apartment list
// @Tags Apartment
// @ID apartment-list
// @Accept json
// @Produce json
// @Success 200 {object} entity.ListApartmentResponse
// @Failure 400 {object} entity.Response
// @Router /apartment [get]
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *ApartmentController) ListApartment(ctx *gin.Context) {
	// TODO add apartment filter
	data, err := c.apartmentUseCase.ListApartment()
	if err != nil {
		c.Failure(ctx, _error.New(_const.StatusBadRequest, err.Error()))
	} else {
		c.Success(ctx, data)
	}
}

// GetApartment godoc
// @Summary Get apartment detail
// @Tags Apartment
// @ID apartment
// @Param id path int true "Apartment ID"
// @Success 200 {object} entity.GetProductResponse
// @Failure 400 {object} entity.Response
// @Router /apartment/{id} [get]
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *ApartmentController) GetApartment(ctx *gin.Context) {
	id, _ := strconv.ParseInt(ctx.Param("id"), 10, 64)
	data, err := c.apartmentUseCase.GetApartment(id)
	if err != nil {
		c.Failure(ctx, err)
	} else {
		c.Success(ctx, data)
	}
}

func (c *ApartmentController) CreateApartment(ctx *gin.Context) {
	fmt.Println("CreateApartment")
	body, _ := ctx.GetRawData()
	var request entity.CreateApartmentRequest
	err := json.Unmarshal(body, &request)
	if err != nil {
		c.Failure(ctx, _error.New(_const.InternalServerErr, "Invalid request body"))
		return
	}

	data, err := c.apartmentUseCase.CreateApartment(&request)
	if err != nil {
		c.Failure(ctx, err)
	} else {
		c.Success(ctx, data)
	}
}

func (c *ApartmentController) UpdateApartment(ctx *gin.Context) {

}
