package unit

// PageDimensions contains the page size and margins of a scanned document page.
type PageDimensions[T UnitConstraint] struct {
	MediumSize Vec2[T]      `json:"mediumSize"` // The size of the page or medium.
	ScanSize   Rectangle[T] `json:"scanSize"`   // The size of the scanned area or image.
}

// NewPageDimensionsFromDensity returns page dimensions for the given resolution resX and resY, and the respective densities.
//
// The resulting PageDimensions will have equal MediumSize and ScanSize (No margin).
// The correct margin or MediumSize can be added later on.
//
// In case any density is nil, this will return zero value PageDimensions.
func NewPageDimensionsFromDensity(resX, resY int, densityX, densityY Density) PageDimensions[Millimeter] {
	if densityX == nil || densityY == nil {
		return PageDimensions[Millimeter]{}
	}

	size := Vec2[Millimeter]{
		X: Millimeter(resX) / Millimeter(densityX.PerMillimeter()),
		Y: Millimeter(resY) / Millimeter(densityY.PerMillimeter()),
	}

	return PageDimensions[Millimeter]{
		MediumSize: size,
		ScanSize: Rectangle[Millimeter]{
			Size: size,
		},
	}
}

// NewPageDimensionsFromLengths returns page dimensions for the given lengths.
//
// The resulting PageDimensions will have equal MediumSize and ScanSize (No margin).
// The correct margin or MediumSize can be added later on.
//
// In case any length is nil, this will return zero value PageDimensions.
func NewPageDimensionsFromLengths(x, y Length) PageDimensions[Millimeter] {
	if x == nil || y == nil {
		return PageDimensions[Millimeter]{}
	}

	size := Vec2[Millimeter]{X: x.Millimeters(), Y: y.Millimeters()}

	return PageDimensions[Millimeter]{
		MediumSize: size,
		ScanSize: Rectangle[Millimeter]{
			Size: size,
		},
	}
}