package transformer

import (
	"apskel-pos-be/internal/contract"
	"apskel-pos-be/internal/models"
)

// Request transformations
func CreateIngredientUnitConverterRequestToModel(req *contract.CreateIngredientUnitConverterRequest) *models.CreateIngredientUnitConverterRequest {
	if req == nil {
		return nil
	}

	return &models.CreateIngredientUnitConverterRequest{
		IngredientID:     req.IngredientID,
		FromUnitID:       req.FromUnitID,
		ToUnitID:         req.ToUnitID,
		ConversionFactor: req.ConversionFactor,
		IsActive:         req.IsActive,
	}
}

func UpdateIngredientUnitConverterRequestToModel(req *contract.UpdateIngredientUnitConverterRequest) *models.UpdateIngredientUnitConverterRequest {
	if req == nil {
		return nil
	}

	return &models.UpdateIngredientUnitConverterRequest{
		FromUnitID:       req.FromUnitID,
		ToUnitID:         req.ToUnitID,
		ConversionFactor: req.ConversionFactor,
		IsActive:         req.IsActive,
	}
}

func ListIngredientUnitConvertersRequestToModel(req *contract.ListIngredientUnitConvertersRequest) *models.ListIngredientUnitConvertersRequest {
	if req == nil {
		return nil
	}

	return &models.ListIngredientUnitConvertersRequest{
		IngredientID: req.IngredientID,
		FromUnitID:   req.FromUnitID,
		ToUnitID:     req.ToUnitID,
		IsActive:     req.IsActive,
		Search:       req.Search,
		Page:         req.Page,
		Limit:        req.Limit,
	}
}

func ConvertUnitRequestToModel(req *contract.ConvertUnitRequest) *models.ConvertUnitRequest {
	if req == nil {
		return nil
	}

	return &models.ConvertUnitRequest{
		IngredientID: req.IngredientID,
		FromUnitID:   req.FromUnitID,
		ToUnitID:     req.ToUnitID,
		Quantity:     req.Quantity,
	}
}

// Response transformations
func IngredientUnitConverterModelResponseToResponse(model *models.IngredientUnitConverterResponse) contract.IngredientUnitConverterResponse {
	if model == nil {
		return contract.IngredientUnitConverterResponse{}
	}

	response := contract.IngredientUnitConverterResponse{
		ID:               model.ID,
		OrganizationID:   model.OrganizationID,
		IngredientID:     model.IngredientID,
		FromUnitID:       model.FromUnitID,
		ToUnitID:         model.ToUnitID,
		ConversionFactor: model.ConversionFactor,
		IsActive:         model.IsActive,
		CreatedAt:        model.CreatedAt,
		UpdatedAt:        model.UpdatedAt,
		CreatedBy:        model.CreatedBy,
		UpdatedBy:        model.UpdatedBy,
	}

	// Map related entities
	if model.Ingredient != nil {
		ingredientResp := IngredientModelResponseToResponse(model.Ingredient)
		response.Ingredient = &ingredientResp
	}
	if model.FromUnit != nil {
		fromUnitResp := UnitModelResponseToResponse(model.FromUnit)
		response.FromUnit = &fromUnitResp
	}
	if model.ToUnit != nil {
		toUnitResp := UnitModelResponseToResponse(model.ToUnit)
		response.ToUnit = &toUnitResp
	}

	return response
}

func ConvertUnitModelResponseToResponse(model *models.ConvertUnitResponse) contract.ConvertUnitResponse {
	if model == nil {
		return contract.ConvertUnitResponse{}
	}

	response := contract.ConvertUnitResponse{
		FromQuantity:     model.FromQuantity,
		ToQuantity:       model.ToQuantity,
		ConversionFactor: model.ConversionFactor,
	}

	// Map units
	if model.FromUnit != nil {
		fromUnitResp := UnitModelResponseToResponse(model.FromUnit)
		response.FromUnit = &fromUnitResp
	}
	if model.ToUnit != nil {
		toUnitResp := UnitModelResponseToResponse(model.ToUnit)
		response.ToUnit = &toUnitResp
	}

	// Map ingredient
	if model.Ingredient != nil {
		ingredientResp := IngredientModelResponseToResponse(model.Ingredient)
		response.Ingredient = &ingredientResp
	}

	return response
}

// Helper functions for related entities
func IngredientModelResponseToResponse(model *models.IngredientResponse) contract.IngredientResponse {
	if model == nil {
		return contract.IngredientResponse{}
	}

	return contract.IngredientResponse{
		ID:   model.ID,
		Name: model.Name,
	}
}

func UnitModelResponseToResponse(model *models.UnitResponse) contract.UnitResponse {
	if model == nil {
		return contract.UnitResponse{}
	}

	return contract.UnitResponse{
		ID:   model.ID,
		Name: model.Name,
	}
}

