<?php

namespace Arrilot\Widgets\Test;

use Arrilot\Widgets\Test\Support\TestApplicationWrapper;
use Arrilot\Widgets\Test\Support\TestCase;
use Arrilot\Widgets\WidgetGroup;

class WidgetGroupTest extends TestCase
{
    /**
     * @var WidgetGroup
     */
    protected $widgetGroup;

    public function setUp(): void
    {
        $this->widgetGroup = new WidgetGroup('key1', new TestApplicationWrapper());
    }

    public function testItCanDisplayWidgets()
    {
        $this->widgetGroup->addWidget('Slider', ['slides' => 5]);
        $this->widgetGroup->addAsyncWidget('Slider');

        $output = $this->widgetGroup->display();

        $this->assertEquals(
            'Slider was executed with $slides = 5 foo: bar'.
            '<div id="arrilot-widget-container-2" style="display:inline" class="arrilot-widget-container">Placeholder here!'.
                '<script type="text/javascript">'.
                    'var widgetTimer2 = setInterval(function() {'.
                        'if (window.$) {'.
                            "$('#arrilot-widget-container-2').load('".$this->ajaxUrl('Slider', [], 2)."');".
                            'clearInterval(widgetTimer2);'.
                        '}'.
                    '}, 100);'.
                '</script>'.
            '</div>', $output);
    }

    public function testItCanSetAndResetPosition()
    {
        $this->widgetGroup->addWidget('Slider', ['slides' => 5, 'foo' => 'Taylor']);
        $this->widgetGroup->position(50)->addWidget('Slider');

        $output = $this->widgetGroup->display();

        $this->assertEquals('Slider was executed with $slides = 6 foo: bar'.
            'Slider was executed with $slides = 5 foo: Taylor', $output);
        $this->assertEquals(100, $this->widgetGroup->getPosition());
    }

    public function testMultipleWidgetGroupsCanExistTogether()
    {
        $this->widgetGroup->addWidget('Slider', ['slides' => 5, 'foo' => 'Taylor']);
        $this->widgetGroup->position(50)->addWidget('Slider');

        $widgetGroup2 = new WidgetGroup('key2', new TestApplicationWrapper());
        $widgetGroup2->position(40)->addWidget('Slider', ['slides' => 10]);
        $widgetGroup2->position(40)->addWidget('Slider', ['slides' => 15]);

        $output = $this->widgetGroup->display();
        $output2 = $widgetGroup2->display();

        $this->assertEquals('Slider was executed with $slides = 6 foo: bar'.
            'Slider was executed with $slides = 5 foo: Taylor', $output);
        $this->assertEquals(100, $this->widgetGroup->getPosition());

        $this->assertEquals('Slider was executed with $slides = 10 foo: bar'.
            'Slider was executed with $slides = 15 foo: bar', $output2);
        $this->assertEquals(100, $widgetGroup2->getPosition());
    }

    public function testSeparator()
    {
        $this->widgetGroup->addWidget('Slider', ['slides' => 5]);
        $this->widgetGroup->addAsyncWidget('Slider');

        $output = $this->widgetGroup->setSeparator('<hr>')->display();

        $this->assertEquals(
            'Slider was executed with $slides = 5 foo: bar'.
            '<hr>'.
            '<div id="arrilot-widget-container-2" style="display:inline" class="arrilot-widget-container">Placeholder here!'.
                '<script type="text/javascript">'.
                    'var widgetTimer2 = setInterval(function() {'.
                        'if (window.$) {'.
                            "$('#arrilot-widget-container-2').load('".$this->ajaxUrl('Slider', [], 2)."');".
                            'clearInterval(widgetTimer2);'.
                        '}'.
                    '}, 100);'.
                '</script>'.
            '</div>', $output);
    }

    public function testWrap()
    {
        $this->widgetGroup->addWidget('Slider', ['slides' => 5]);
        $this->widgetGroup->addAsyncWidget('Slider');

        $output = $this->widgetGroup->wrap(function ($content, $index, $count) {
            return "<div class='widget widget-{$index}-{$count}'>{$content}</div>";
        })->display();

        $this->assertEquals(
            '<div class=\'widget widget-0-2\'>Slider was executed with $slides = 5 foo: bar</div>'.
            '<div class=\'widget widget-1-2\'><div id="arrilot-widget-container-2" style="display:inline" class="arrilot-widget-container">Placeholder here!'.
                '<script type="text/javascript">'.
                    'var widgetTimer2 = setInterval(function() {'.
                        'if (window.$) {'.
                            "$('#arrilot-widget-container-2').load('".$this->ajaxUrl('Slider', [], 2)."');".
                            'clearInterval(widgetTimer2);'.
                        '}'.
                    '}, 100);'.
                '</script>'.
            '</div></div>', $output);
    }

    public function testIsEmpty()
    {
        $this->assertTrue($this->widgetGroup->isEmpty());

        $this->widgetGroup->addWidget('Slider');

        $this->assertFalse($this->widgetGroup->isEmpty());
    }

    public function testAny()
    {
        $this->assertFalse($this->widgetGroup->any());

        $this->widgetGroup->addWidget('Slider');

        $this->assertTrue($this->widgetGroup->any());
    }

    public function testCount()
    {
        $this->assertSame(0, $this->widgetGroup->count());

        $this->widgetGroup->addWidget('Slider');
        $this->assertSame(1, $this->widgetGroup->count());

        $this->widgetGroup->position(50)->addWidget('Slider');
        $this->assertSame(2, $this->widgetGroup->count());

        $this->widgetGroup->position(50)->addWidget('Slider');
        $this->assertSame(3, $this->widgetGroup->count());
    }

    public function testRemoveById()
    {
        $id1 = $this->widgetGroup->addWidget('Slider');
        $id2 = $this->widgetGroup->addWidget('Slider');
        $this->assertSame(2, $this->widgetGroup->count());

        $this->widgetGroup->removeById($id1);
        $this->assertSame(1, $this->widgetGroup->count());

        $this->widgetGroup->removeById($id2);
        $this->assertSame(0, $this->widgetGroup->count());
    }

    public function testRemoveByName()
    {
        $this->widgetGroup->addWidget('Slider');
        $this->widgetGroup->addWidget('TestDefaultSlider');
        $this->widgetGroup->addWidget('Slider');
        $this->assertSame(3, $this->widgetGroup->count());

        $this->widgetGroup->removeByName('Slider');
        $this->assertSame(1, $this->widgetGroup->count());

        $this->widgetGroup->removeByName('TestDefaultSlider');
        $this->assertSame(0, $this->widgetGroup->count());
    }

    public function testRemoveByPosition()
    {
        $this->widgetGroup->position(60)->addWidget('Slider');
        $this->widgetGroup->position(50)->addWidget('TestDefaultSlider');
        $this->widgetGroup->position(50)->addWidget('Slider');
        $this->assertSame(3, $this->widgetGroup->count());

        $this->widgetGroup->removeByPosition(50);
        $this->assertSame(1, $this->widgetGroup->count());

        $this->widgetGroup->removeByPosition(60);
        $this->assertSame(0, $this->widgetGroup->count());
    }

    public function testRemoveAll()
    {
        $this->widgetGroup->addWidget('Slider');
        $this->widgetGroup->addWidget('TestDefaultSlider');
        $this->widgetGroup->addWidget('Slider');
        $this->assertSame(3, $this->widgetGroup->count());

        $this->widgetGroup->removeAll();
        $this->assertSame(0, $this->widgetGroup->count());
    }
}
