<?php

namespace Roundcube\Tests\Browser\Mail;

use PHPUnit\Framework\Attributes\Depends;
use Roundcube\Tests\Browser\Bootstrap;
use Roundcube\Tests\Browser\Components\Toolbarmenu;
use Roundcube\Tests\Browser\TestCase;

class ListTest extends TestCase
{
    protected static $msgcount = 0;

    #[\Override]
    public static function setUpBeforeClass(): void
    {
        Bootstrap::init_imap(true);
        Bootstrap::purge_mailbox('INBOX');

        // import email messages
        foreach (glob(TESTS_DIR . 'data/mail/list_??.eml') as $f) {
            Bootstrap::import_message($f, 'INBOX');
            self::$msgcount++;
        }
    }

    public function testList()
    {
        $this->browse(function ($browser) {
            $browser->go('mail');

            $browser->waitUntilNotBusy()
                ->assertElementsCount('#messagelist tbody tr', self::$msgcount);

            // check message list
            $browser->assertVisible('#messagelist tbody tr:first-child.unread');

            $this->assertSame('Test HTML with local and remote image',
                $browser->text('#messagelist tbody tr:first-child span.subject'));

            // Note: This element icon has width=0, use assertPresent() not assertVisible()
            $browser->assertPresent('#messagelist tbody tr:first-child span.msgicon.unread');

            // List toolbar menu
            $browser->assertVisible('#layout-list .header a.toolbar-button.refresh:not(.disabled)');

            if ($browser->isDesktop()) {
                $browser->with('#toolbar-list-menu', static function ($browser) {
                    $browser->assertVisible('a.select:not(.disabled)');
                    $browser->assertVisible('a.options:not(.disabled)');

                    $imap = Bootstrap::get_storage();
                    if ($imap->get_threading()) {
                        $browser->assertVisible('a.threads:not(.disabled)');
                    } else {
                        $browser->assertMissing('a.threads');
                    }
                });
            } elseif ($browser->isTablet()) {
                $browser->click('.toolbar-list-button')
                    ->waitFor('#toolbar-list-menu');

                $browser->with('#toolbar-list-menu', static function ($browser) {
                    $browser->assertVisible('a.select:not(.disabled)');
                    $browser->assertVisible('a.options:not(.disabled)');

                    $imap = Bootstrap::get_storage();
                    if ($imap->get_threading()) {
                        $browser->assertVisible('a.threads:not(.disabled)');
                    } else {
                        $browser->assertMissing('a.threads');
                    }
                });

                $browser->click(); // hide the popup menu
            } else { // phone
                // On phones list options are in the toolbar menu
                $browser->with(new Toolbarmenu(), static function ($browser) {
                    $active = ['select', 'options'];
                    $missing = [];
                    $imap = Bootstrap::get_storage();

                    if ($imap->get_threading()) {
                        $active[] = 'threads';
                    } else {
                        $missing[] = 'threads';
                    }

                    $browser->assertMenuState($active, [], $missing);
                });
            }
        });
    }

    /**
     * @depends testList
     */
    #[Depends('testList')]
    public function testListSelection()
    {
        $this->browse(static function ($browser) {
            if ($browser->isPhone()) {
                $browser->with(new Toolbarmenu(), static function ($browser) {
                    $browser->clickMenuItem('select', null, false);
                });
            } elseif ($browser->isTablet()) {
                $browser->click('.toolbar-list-button');
                $browser->click('#toolbar-list-menu a.select');
            } else {
                $browser->click('#toolbar-list-menu a.select');
                $browser->assertFocused('#toolbar-list-menu a.select');
            }

            // Popup menu content
            $browser->waitFor('#listselect-menu');
            $browser->with('#listselect-menu', static function ($browser) {
                $browser->assertVisible('a.selection:not(.disabled)');
                $browser->assertVisible('a.select.all:not(.disabled)');
                $browser->assertVisible('a.select.page:not(.disabled)');
                $browser->assertVisible('a.select.unread:not(.disabled)');
                $browser->assertVisible('a.select.flagged:not(.disabled)');
                $browser->assertVisible('a.select.invert:not(.disabled)');
                $browser->assertVisible('a.select.none:not(.disabled)');
            });

            // Close the menu(s) by clicking the page body
            $browser->click();
            $browser->waitUntilMissing('#listselect-menu');

            // TODO: Test selection actions
        });
    }
}
