package transform

import (
	"github.com/UpmeshLTD/urus-aio/infrastructure/db/entities"
	"github.com/UpmeshLTD/urus-aio/shipment/server/http/dto"
)

func ToPickupPointDTO(pp *entities.PickupPoint) *dto.PickupPoint {
	var address = pp.Address
	locations := make([]*dto.SubLevelLocation, 0)
	for _, v := range address.SortSubLevelLocations() {
		locations = append(locations, &dto.SubLevelLocation{
			ID:                v.ID.ToInt64(),
			InternationalName: v.InternationalName,
			LocalizedName:     v.LocalizedName,
			ParentID:          v.ParentID,
		})
	}
	return &dto.PickupPoint{
		ID:          pp.ID.ID,
		LastName:    pp.LastName,
		FirstName:   pp.FirstName,
		Email:       pp.Email,
		PhoneNumber: pp.PhoneNumber,

		Default:    pp.Default,
		Deactivate: pp.Deactivate,

		Address: &dto.Address{
			ID:                address.ID.ToInt64(),
			Address1:          address.Address1,
			Address2:          address.Address2,
			PostalCode:        address.PostalCode,
			UnitNumber:        address.UnitNumber,
			CountryID:         address.CountryID,
			Deactivate:        address.Deactivate,
			SubLevelLocations: locations,
		},
	}
}

func ToPickupPointDTOs(entities []*entities.PickupPoint) []*dto.PickupPoint {
	values := make([]*dto.PickupPoint, 0, len(entities))
	for _, v := range entities {
		values = append(values, ToPickupPointDTO(v))
	}
	return values
}

func CreatePickupPointRequestDTOToEntity(req *dto.CreatePickupPointRequest, workspaceID string, address *entities.Address) *entities.PickupPoint {
	return &entities.PickupPoint{
		LastName:    req.LastName,
		FirstName:   req.FirstName,
		PhoneNumber: req.PhoneNumber,
		Email:       req.Email,

		WorkspaceID: workspaceID,
		Address:     *address,

		Default: req.Default,
	}
}

func UpdatePickupPointRequestDTOToEntity(req *dto.UpdatePickupPointRequest) *entities.PickupPoint {
	address := req.Address
	return &entities.PickupPoint{
		LastName:    req.LastName,
		FirstName:   req.FirstName,
		PhoneNumber: req.PhoneNumber,
		Email:       req.Email,

		Address: entities.Address{
			BaseEntity:        entities.BaseEntity{ID: entities.ID{ID: address.ID}},
			Address1:          address.Address1,
			Address2:          address.Address2,
			PostalCode:        address.PostalCode,
			UnitNumber:        address.UnitNumber,
			CountryID:         address.CountryID,
			Deactivate:        address.Deactivate,
			SubLevelLocations: ConvertSubLevelLocationsDTOToEntity(address.SubLevelLocationIDs),
		},

		Default:    req.Default,
		Deactivate: req.Deactivate,
	}
}
