<?php

/**
 * JPGraph v4.0.3
 */

namespace Amenadiel\JpGraph\Plot;

use Amenadiel\JpGraph\Graph;
use Amenadiel\JpGraph\Image;
use Amenadiel\JpGraph\Util;

/**
 * File:        JPGRAPH_ICONPLOT.PHP
 * // Description: Extension module to add icons to plots
 * // Created:     2004-02-18
 * // Ver:         $Id: jpgraph_iconplot.php 1404 2009-06-28 15:25:41Z ljp $
 * //
 * // Copyright (c) Asial Corporation. All rights reserved.
 */

/**
 * @class IconPlot
 * // Description: Make it possible to add a (small) image
 * // to the graph
 */
class IconPlot
{
    public $iX               = 0;
    public $iY               = 0;
    public $iScale           = 1.0;
    public $iMix             = 100;
    private $iHorAnchor      = 'left';
    private $iVertAnchor     = 'top';
    private $iFile           = '';
    private $iAnchors        = ['left', 'right', 'top', 'bottom', 'center'];
    private $iCountryFlag    = '';
    private $iCountryStdSize = 3;
    private $iScalePosY;
    private $iScalePosX;
    private $iImgString = '';

    public function __construct($aFile = '', $aX = 0, $aY = 0, $aScale = 1.0, $aMix = 100)
    {
        $this->iFile  = $aFile;
        $this->iX     = $aX;
        $this->iY     = $aY;
        $this->iScale = $aScale;
        if ($aMix < 0 || $aMix > 100) {
            Util\JpGraphError::RaiseL(8001); //('Mix value for icon must be between 0 and 100.');
        }
        $this->iMix = $aMix;
    }

    public function SetCountryFlag($aFlag, $aX = 0, $aY = 0, $aScale = 1.0, $aMix = 100, $aStdSize = 3)
    {
        $this->iCountryFlag = $aFlag;
        $this->iX           = $aX;
        $this->iY           = $aY;
        $this->iScale       = $aScale;
        if ($aMix < 0 || $aMix > 100) {
            Util\JpGraphError::RaiseL(8001); //'Mix value for icon must be between 0 and 100.');
        }
        $this->iMix            = $aMix;
        $this->iCountryStdSize = $aStdSize;
    }

    public function SetPos($aX, $aY)
    {
        $this->iX = $aX;
        $this->iY = $aY;
    }

    public function CreateFromString($aStr)
    {
        $this->iImgString = $aStr;
    }

    public function SetScalePos($aX, $aY)
    {
        $this->iScalePosX = $aX;
        $this->iScalePosY = $aY;
    }

    public function SetScale($aScale)
    {
        $this->iScale = $aScale;
    }

    public function SetMix($aMix)
    {
        if ($aMix < 0 || $aMix > 100) {
            Util\JpGraphError::RaiseL(8001); //('Mix value for icon must be between 0 and 100.');
        }
        $this->iMix = $aMix;
    }

    public function SetAnchor($aXAnchor = 'left', $aYAnchor = 'center')
    {
        if (!in_array($aXAnchor, $this->iAnchors, true) ||
            !in_array($aYAnchor, $this->iAnchors, true)) {
            Util\JpGraphError::RaiseL(8002); //("Anchor position for icons must be one of 'top', 'bottom', 'left', 'right' or 'center'");
        }
        $this->iHorAnchor  = $aXAnchor;
        $this->iVertAnchor = $aYAnchor;
    }

    public function PreStrokeAdjust($aGraph)
    {
        // Nothing to do ...
    }

    public function DoLegend($aGraph)
    {
        // Nothing to do ...
    }

    public function Max()
    {
        return [false, false];
    }

    // The next four function are framework function tht gets called
    // from Gantt and is not menaiungfull in the context of Icons but
    // they must be implemented to avoid errors.
    public function GetMaxDate()
    {
        return false;
    }

    public function GetMinDate()
    {
        return false;
    }

    public function GetLineNbr()
    {
        return 0;
    }

    public function GetAbsHeight()
    {
        return 0;
    }

    public function Min()
    {
        return [false, false];
    }

    public function StrokeMargin(&$aImg)
    {
        return true;
    }

    public function Stroke($aImg, $axscale = null, $ayscale = null)
    {
        $this->StrokeWithScale($aImg, $axscale, $ayscale);
    }

    public function StrokeWithScale($aImg, $axscale, $ayscale)
    {
        if ($this->iScalePosX === null || $this->iScalePosY === null ||
            $axscale === null || $ayscale === null) {
            $this->_Stroke($aImg);
        } else {
            $this->_Stroke(
                $aImg,
                round($axscale->Translate($this->iScalePosX)),
                round($ayscale->Translate($this->iScalePosY))
            );
        }
    }

    public function GetWidthHeight()
    {
        $dummy = 0;

        return $this->_Stroke($dummy, null, null, true);
    }

    public function _Stroke($aImg, $x = null, $y = null, $aReturnWidthHeight = false)
    {
        if ($this->iFile != '' && $this->iCountryFlag != '') {
            Util\JpGraphError::RaiseL(8003); //('It is not possible to specify both an image file and a country flag for the same icon.');
        }
        if ($this->iFile != '') {
            $gdimg = Graph\Graph::LoadBkgImage('', $this->iFile);
        } elseif ($this->iImgString != '') {
            $gdimg = Image\Image::CreateFromString($this->iImgString);
        } else {
            $fobj  = new Image\FlagImages($this->iCountryStdSize);
            $dummy = '';
            $gdimg = $fobj->GetImgByName($this->iCountryFlag, $dummy);
        }

        $iconw = imagesx($gdimg);
        $iconh = imagesy($gdimg);

        if ($aReturnWidthHeight) {
            return [round($iconw * $this->iScale), round($iconh * $this->iScale)];
        }

        if ($x !== null && $y !== null) {
            $this->iX = $x;
            $this->iY = $y;
        }
        if ($this->iX >= 0 && $this->iX <= 1.0) {
            $w        = imagesx($aImg->img);
            $this->iX = round($w * $this->iX);
        }
        if ($this->iY >= 0 && $this->iY <= 1.0) {
            $h        = imagesy($aImg->img);
            $this->iY = round($h * $this->iY);
        }

        if ($this->iHorAnchor == 'center') {
            $this->iX -= round($iconw * $this->iScale / 2);
        }

        if ($this->iHorAnchor == 'right') {
            $this->iX -= round($iconw * $this->iScale);
        }

        if ($this->iVertAnchor == 'center') {
            $this->iY -= round($iconh * $this->iScale / 2);
        }

        if ($this->iVertAnchor == 'bottom') {
            $this->iY -= round($iconh * $this->iScale);
        }

        $aImg->CopyMerge(
            $gdimg,
            $this->iX,
            $this->iY,
            0,
            0,
            round($iconw * $this->iScale),
            round($iconh * $this->iScale),
            $iconw,
            $iconh,
            $this->iMix
        );
    }
}
