<?php

namespace TablePress\PhpOffice\PhpSpreadsheet\Shared;

use SimpleXMLElement;

class Drawing
{
	/**
	 * Convert pixels to EMU.
	 *
	 * @param int $pixelValue Value in pixels
	 *
	 * @return float|int Value in EMU
	 */
	public static function pixelsToEMU(int $pixelValue)
	{
		return $pixelValue * 9525;
	}

	/**
	 * Convert EMU to pixels.
	 *
	 * @param int|SimpleXMLElement $emuValue Value in EMU
	 *
	 * @return int Value in pixels
	 */
	public static function EMUToPixels($emuValue): int
	{
		$emuValue = (int) $emuValue;
		if ($emuValue != 0) {
			return (int) round($emuValue / 9525);
		}

		return 0;
	}

	/**
	 * Convert pixels to column width. Exact algorithm not known.
	 * By inspection of a real Excel file using Calibri 11, one finds 1000px ~ 142.85546875
	 * This gives a conversion factor of 7. Also, we assume that pixels and font size are proportional.
	 *
	 * @param int $pixelValue Value in pixels
	 *
	 * @return float|int Value in cell dimension
	 */
	public static function pixelsToCellDimension(int $pixelValue, \TablePress\PhpOffice\PhpSpreadsheet\Style\Font $defaultFont)
	{
		// Font name and size
		$name = $defaultFont->getName();
		$size = $defaultFont->getSize();
		$sizex = ($size !== null && $size == (int) $size) ? ((int) $size) : "$size";

		if (isset(Font::DEFAULT_COLUMN_WIDTHS[$name][$sizex])) {
			// Exact width can be determined
			return $pixelValue * Font::DEFAULT_COLUMN_WIDTHS[$name][$sizex]['width']
				/ Font::DEFAULT_COLUMN_WIDTHS[$name][$sizex]['px'];
		}

		// We don't have data for this particular font and size, use approximation by
		// extrapolating from Calibri 11
		return $pixelValue * 11 * Font::DEFAULT_COLUMN_WIDTHS['Calibri'][11]['width']
			/ Font::DEFAULT_COLUMN_WIDTHS['Calibri'][11]['px'] / $size;
	}

	/**
	 * Convert column width from (intrinsic) Excel units to pixels.
	 *
	 * @param float $cellWidth Value in cell dimension
	 * @param \TablePress\PhpOffice\PhpSpreadsheet\Style\Font $defaultFont Default font of the workbook
	 *
	 * @return int Value in pixels
	 */
	public static function cellDimensionToPixels(float $cellWidth, \TablePress\PhpOffice\PhpSpreadsheet\Style\Font $defaultFont): int
	{
		// Font name and size
		$name = $defaultFont->getName();
		$size = $defaultFont->getSize();
		$sizex = ($size !== null && $size == (int) $size) ? ((int) $size) : "$size";

		if (isset(Font::DEFAULT_COLUMN_WIDTHS[$name][$sizex])) {
			// Exact width can be determined
			$colWidth = $cellWidth * Font::DEFAULT_COLUMN_WIDTHS[$name][$sizex]['px']
				/ Font::DEFAULT_COLUMN_WIDTHS[$name][$sizex]['width'];
		} else {
			// We don't have data for this particular font and size, use approximation by
			// extrapolating from Calibri 11
			$colWidth = $cellWidth * $size * Font::DEFAULT_COLUMN_WIDTHS['Calibri'][11]['px']
				/ Font::DEFAULT_COLUMN_WIDTHS['Calibri'][11]['width'] / 11;
		}

		// Round pixels to closest integer
		$colWidth = (int) round($colWidth);

		return $colWidth;
	}

	/**
	 * Convert pixels to points.
	 *
	 * @param int $pixelValue Value in pixels
	 *
	 * @return float Value in points
	 */
	public static function pixelsToPoints(int $pixelValue): float
	{
		return $pixelValue * 0.75;
	}

	/**
	 * Convert points to pixels.
	 *
	 * @param float|int $pointValue Value in points
	 *
	 * @return int Value in pixels
	 */
	public static function pointsToPixels($pointValue): int
	{
		return (int) ceil($pointValue / 0.75);
	}

	/**
	 * Convert degrees to angle.
	 *
	 * @param int $degrees Degrees
	 *
	 * @return int Angle
	 */
	public static function degreesToAngle(int $degrees): int
	{
		return (int) round($degrees * 60000);
	}

	/**
	 * Convert angle to degrees.
	 *
	 * @param int|SimpleXMLElement $angle Angle
	 *
	 * @return int Degrees
	 */
	public static function angleToDegrees($angle): int
	{
		$angle = (int) $angle;
		if ($angle != 0) {
			return (int) round($angle / 60000);
		}

		return 0;
	}
}
