<?php

declare(strict_types=1);

namespace Tests\CpChart\Unit;

use Codeception\Test\Unit;
use CpChart\Chart\Pie;
use CpChart\Data;
use CpChart\Image;
use Tests\CpChart\Support\UnitTester;

use const DIRECTION_VERTICAL;
use const LEGEND_HORIZONTAL;
use const LEGEND_NOBORDER;
use const PIE_VALUE_BOTH;
use const TEXT_ALIGN_TOPMIDDLE;

final class PieTest extends Unit
{
    protected UnitTester $tester;

    public function test2dPieRender(): void
    {
        $data = new Data();
        $data->addPoints([40, 60, 15, 10, 6, 4], 'ScoreA');
        $data->setSerieDescription('ScoreA', 'Application A');
        $data->addPoints(['<10', '10<>20', '20<>40', '40<>60', '60<>80', '>80'], 'Labels');
        $data->setAbscissa('Labels');
        $image = new Image(700, 230, $data);
        $image->drawFilledRectangle(
            0,
            0,
            700,
            230,
            [
                'R' => 173, 'G' => 152, 'B' => 217, 'Dash' => 1, 'DashR' => 193,
                'DashG' => 172, 'DashB' => 237
            ]
        );
        $image->drawGradientArea(
            0,
            0,
            700,
            230,
            DIRECTION_VERTICAL,
            [
                'StartR' => 209, 'StartG' => 150, 'StartB' => 231, 'EndR' => 111,
                'EndG' => 3, 'EndB' => 138, 'Alpha' => 50
            ]
        );
        $image->drawGradientArea(
            0,
            0,
            700,
            20,
            DIRECTION_VERTICAL,
            [
                'StartR' => 0, 'StartG' => 0, 'StartB' => 0, 'EndR' => 50, 'EndG' => 50,
                'EndB' => 50, 'Alpha' => 100
            ]
        );
        $image->drawRectangle(0, 0, 699, 229, ['R' => 0, 'G' => 0, 'B' => 0]);
        $image->setFontProperties(['FontName' => 'Silkscreen.ttf', 'FontSize' => 6]);
        $image->drawText(
            10,
            13,
            'pPie - Draw 2D pie charts',
            ['R' => 255, 'G' => 255, 'B' => 255]
        );
        $image->setFontProperties(
            ['FontName' => 'Forgotte.ttf', 'FontSize' => 10, 'R' => 80, 'G' => 80, 'B' => 80]
        );
        $image->setShadow(
            true,
            ['X' => 2, 'Y' => 2, 'R' => 150, 'G' => 150, 'B' => 150, 'Alpha' => 100]
        );
        $pieChart = new Pie($image, $data);
        $pieChart->draw2DPie(140, 125, ['SecondPass' => false]);
        $pieChart->draw2DPie(340, 125, ['DrawLabels' => true, 'Border' => true]);
        $pieChart->draw2DPie(
            540,
            125,
            [
                'DataGapAngle' => 10, 'DataGapRadius' => 6, 'Border' => true,
                'BorderR' => 255, 'BorderG' => 255, 'BorderB' => 255
            ]
        );

        $image->setFontProperties(['FontName' => 'MankSans.ttf', 'FontSize' => 11]);
        $image->setShadow(
            true,
            ['X' => 1, 'Y' => 1, 'R' => 0, 'G' => 0, 'B' => 0, 'Alpha' => 20]
        );
        $image->drawText(
            140,
            200,
            'Single AA pass',
            ['R' => 0, 'G' => 0, 'B' => 0, 'Align' => TEXT_ALIGN_TOPMIDDLE]
        );
        $image->drawText(
            540,
            200,
            'Extended AA pass / Splitted',
            ['R' => 0, 'G' => 0, 'B' => 0, 'Align' => TEXT_ALIGN_TOPMIDDLE]
        );

        $filename = $this->tester->getOutputPathForChart('draw2DPie.png');
        $pieChart->pChartObject->render($filename);
        $pieChart->pChartObject->stroke();

        $this->tester->seeFileFound($filename);
    }

    public function test2dRingRender(): void
    {
        $data = new Data();
        $data->addPoints([50, 2, 3, 4, 7, 10, 25, 48, 41, 10], 'ScoreA');
        $data->setSerieDescription('ScoreA', 'Application A');
        $data->addPoints(
            ['A0', 'B1', 'C2', 'D3', 'E4', 'F5', 'G6', 'H7', 'I8', 'J9'],
            'Labels'
        );
        $data->setAbscissa('Labels');
        $image = new Image(300, 260, $data);
        $settings = [
            'R' => 170, 'G' => 183, 'B' => 87, 'Dash' => 1, 'DashR' => 190,
            'DashG' => 203, 'DashB' => 107
        ];
        $image->drawFilledRectangle(0, 0, 300, 300, $settings);
        $settings = [
            'StartR' => 219, 'StartG' => 231, 'StartB' => 139, 'EndR' => 1,
            'EndG' => 138, 'EndB' => 68, 'Alpha' => 50
        ];
        $image->drawGradientArea(0, 0, 300, 260, DIRECTION_VERTICAL, $settings);
        $image->drawGradientArea(
            0,
            0,
            300,
            20,
            DIRECTION_VERTICAL,
            [
                'StartR' => 0, 'StartG' => 0, 'StartB' => 0, 'EndR' => 50, 'EndG' => 50,
                'EndB' => 50, 'Alpha' => 100
            ]
        );
        $image->drawRectangle(0, 0, 299, 259, ['R' => 0, 'G' => 0, 'B' => 0]);
        $image->setFontProperties(['FontName' => 'Silkscreen.ttf', 'FontSize' => 6]);
        $image->drawText(
            10,
            13,
            'pPie - Draw 2D ring charts',
            ['R' => 255, 'G' => 255, 'B' => 255]
        );
        $image->setFontProperties([
            'FontName' => 'Forgotte.ttf', 'FontSize' => 10, 'R' => 80, 'G' => 80, 'B' => 80
        ]);
        $image->setShadow(
            true,
            ['X' => 2, 'Y' => 2, 'R' => 0, 'G' => 0, 'B' => 0, 'Alpha' => 50]
        );
        $pieChart = new Pie($image, $data);
        $pieChart->draw2DRing(
            160,
            140,
            ['DrawLabels' => true, 'LabelStacked' => true, 'Border' => true]
        );
        $image->setShadow(false);
        $pieChart->drawPieLegend(15, 40, ['Alpha' => 20]);

        $filename = $this->tester->getOutputPathForChart('draw2DRing.png');
        $pieChart->pChartObject->render($filename);
        $pieChart->pChartObject->stroke();

        $this->tester->seeFileFound($filename);
    }

    public function test3dPieRender(): void
    {
        $data = new Data();
        $data->addPoints([40, 30, 20], 'ScoreA');
        $data->setSerieDescription('ScoreA', 'Application A');
        $data->addPoints(['A', 'B', 'C'], 'Labels');
        $data->setAbscissa('Labels');
        $image = new Image(700, 230, $data, true);
        $settings = [
            'R' => 173, 'G' => 152, 'B' => 217, 'Dash' => 1, 'DashR' => 193,
            'DashG' => 172, 'DashB' => 237
        ];
        $image->drawFilledRectangle(0, 0, 700, 230, $settings);
        $settings = [
            'StartR' => 209, 'StartG' => 150, 'StartB' => 231, 'EndR' => 111,
            'EndG' => 3, 'EndB' => 138, 'Alpha' => 50
        ];
        $image->drawGradientArea(0, 0, 700, 230, DIRECTION_VERTICAL, $settings);
        $image->drawGradientArea(
            0,
            0,
            700,
            20,
            DIRECTION_VERTICAL,
            [
                'StartR' => 0, 'StartG' => 0, 'StartB' => 0, 'EndR' => 50, 'EndG' => 50,
                'EndB' => 50, 'Alpha' => 100
            ]
        );
        $image->drawRectangle(0, 0, 699, 229, ['R' => 0, 'G' => 0, 'B' => 0]);
        $image->setFontProperties(['FontName' => 'Silkscreen.ttf', 'FontSize' => 6]);
        $image->drawText(
            10,
            13,
            'pPie - Draw 3D pie charts',
            ['R' => 255, 'G' => 255, 'B' => 255]
        );
        $image->setFontProperties([
            'FontName' => 'Forgotte.ttf', 'FontSize' => 10,
            'R' => 80, 'G' => 80, 'B' => 80
        ]);
        $pieChart = new Pie($image, $data);
        $pieChart->setSliceColor(0, ['R' => 143, 'G' => 197, 'B' => 0]);
        $pieChart->setSliceColor(1, ['R' => 97, 'G' => 77, 'B' => 63]);
        $pieChart->setSliceColor(2, ['R' => 97, 'G' => 113, 'B' => 63]);
        $pieChart->draw3DPie(120, 125, ['SecondPass' => false]);
        $pieChart->draw3DPie(340, 125, ['DrawLabels' => true, 'Border' => true]);
        $image->setShadow(
            true,
            ['X' => 3, 'Y' => 3, 'R' => 0, 'G' => 0, 'B' => 0, 'Alpha' => 10]
        );
        $pieChart->draw3DPie(
            560,
            125,
            ['WriteValues' => PIE_VALUE_BOTH, 'DataGapAngle' => 10, 'DataGapRadius' => 6, 'Border' => true]
        );
        $image->setFontProperties(['FontName' => 'pf_arma_five.ttf', 'FontSize' => 6]);
        $image->setShadow(
            true,
            ['X' => 1, 'Y' => 1, 'R' => 0, 'G' => 0, 'B' => 0, 'Alpha' => 20]
        );
        $image->drawText(
            120,
            200,
            'Single AA pass',
            [
                'DrawBox' => true, 'BoxRounded' => true, 'R' => 0, 'G' => 0, 'B' => 0,
                'Align' => TEXT_ALIGN_TOPMIDDLE
            ]
        );
        $image->drawText(
            440,
            200,
            'Extended AA pass / Splitted',
            [
                'DrawBox' => true, 'BoxRounded' => true, 'R' => 0, 'G' => 0, 'B' => 0,
                'Align' => TEXT_ALIGN_TOPMIDDLE
            ]
        );
        $image->setFontProperties([
            'FontName' => 'Silkscreen.ttf', 'FontSize' => 6,
            'R' => 255, 'G' => 255, 'B' => 255
        ]);
        $pieChart->drawPieLegend(
            600,
            8,
            ['Style' => LEGEND_NOBORDER, 'Mode' => LEGEND_HORIZONTAL]
        );

        $filename = $this->tester->getOutputPathForChart('draw3DPie.png');
        $pieChart->pChartObject->render($filename);
        $pieChart->pChartObject->stroke();

        $this->tester->seeFileFound($filename);
    }

    public function test3dRingRender(): void
    {
        $data = new Data();
        $data->addPoints([50, 2, 3, 4, 7, 10, 25, 48, 41, 10], 'ScoreA');
        $data->setSerieDescription('ScoreA', 'Application A');
        $data->addPoints(
            ['A0', 'B1', 'C2', 'D3', 'E4', 'F5', 'G6', 'H7', 'I8', 'J9'],
            'Labels'
        );
        $data->setAbscissa('Labels');
        $image = new Image(400, 400, $data);
        $settings = [
            'R' => 170, 'G' => 183, 'B' => 87, 'Dash' => 1, 'DashR' => 190,
            'DashG' => 203, 'DashB' => 107
        ];
        $image->drawFilledRectangle(0, 0, 400, 400, $settings);
        $settings = [
            'StartR' => 219, 'StartG' => 231, 'StartB' => 139, 'EndR' => 1,
            'EndG' => 138, 'EndB' => 68, 'Alpha' => 50
        ];
        $image->drawGradientArea(0, 0, 400, 400, DIRECTION_VERTICAL, $settings);
        $image->drawGradientArea(
            0,
            0,
            400,
            20,
            DIRECTION_VERTICAL,
            [
                'StartR' => 0, 'StartG' => 0, 'StartB' => 0, 'EndR' => 50, 'EndG' => 50,
                'EndB' => 50, 'Alpha' => 100
            ]
        );
        $image->drawRectangle(0, 0, 399, 399, ['R' => 0, 'G' => 0, 'B' => 0]);
        $image->setFontProperties(['FontName' => 'Silkscreen.ttf', 'FontSize' => 6]);
        $image->drawText(
            10,
            13,
            'pPie - Draw 3D ring charts',
            ['R' => 255, 'G' => 255, 'B' => 255]
        );
        $image->setFontProperties([
            'FontName' => 'Forgotte.ttf',
            'FontSize' => 10,
            'R' => 80,
            'G' => 80,
            'B' => 80
        ]);
        $image->setShadow(
            true,
            ['X' => 2, 'Y' => 2, 'R' => 0, 'G' => 0, 'B' => 0, 'Alpha' => 50]
        );
        $pieChart = new Pie($image, $data);
        $pieChart->draw3DRing(
            200,
            200,
            ['DrawLabels' => true, 'LabelStacked' => true, 'Border' => true]
        );
        $pieChart->drawPieLegend(
            80,
            360,
            ['Mode' => LEGEND_HORIZONTAL, 'Style' => LEGEND_NOBORDER, 'Alpha' => 20]
        );

        $filename = $this->tester->getOutputPathForChart('draw3DRing.png');
        $pieChart->pChartObject->render($filename);
        $pieChart->pChartObject->stroke();

        $this->tester->seeFileFound($filename);
    }
}
