<?php

namespace Tests\Browser\Plugins\Archive;

use Roundcube\Tests\Browser\Bootstrap;
use Roundcube\Tests\Browser\TestCase;

class SettingsTest extends TestCase
{
    #[\Override]
    public static function setUpBeforeClass(): void
    {
        Bootstrap::init_db();
    }

    /**
     * Test Folders UI
     */
    public function testFolders()
    {
        $this->browse(static function ($browser) {
            $browser->go('settings', 'folders');

            // Folders list
            $browser->with('#subscription-table', static function ($browser) {
                $browser->assertHasClass('li:nth-child(7)', 'archive')
                    ->assertSeeIn('li:nth-child(7)', 'Archive')
                    ->assertPresent('li:nth-child(7) [type=checkbox][disabled]');
            });
        });
    }

    /**
     * Test Preferences UI
     */
    public function testPreferences()
    {
        $this->browse(static function ($browser) {
            $browser->go('settings');

            if (!$browser->isDesktop()) {
                $browser->click('#settings-menu li.preferences')
                    ->waitFor('#sections-table');
            }

            $browser->click('#sections-table tr.folders');

            if ($browser->isPhone()) {
                $browser->waitFor('#layout-content .footer a.button.submit:not(.disabled)');
            }

            $browser->withinFrame('#preferences-frame', static function ($browser) {
                if (!$browser->isPhone()) {
                    $browser->waitFor('.formbuttons button.submit');
                }

                // Main Options fieldset
                $browser->with('form.propform fieldset.main', static function ($browser) {
                    $browser->assertSeeIn('legend', 'Main Options');

                    $browser->assertSeeIn('label[for=_archive_mbox]', 'Archive')
                        ->assertVisible('select[name=_archive_mbox]')
                        ->assertSelected('select[name=_archive_mbox]', 'Archive');

                    $browser->select('_archive_mbox', 'Drafts');
                });

                // Archive fieldset
                $browser->with('form.propform fieldset.archive', static function ($browser) {
                    $browser->assertSeeIn('legend', 'Archive');

                    $browser->assertSeeIn('label[for=ff_archive_type]', 'Divide archive by')
                        ->assertVisible('select[name=_archive_type]')
                        ->assertSelected('select[name=_archive_type]', '')
                        ->with('select[name=_archive_type]', static function ($browser) {
                            $browser->assertValue('option:nth-child(1)', '')
                                ->assertSeeIn('option:nth-child(1)', 'None')
                                ->assertValue('option:nth-child(2)', 'year')
                                ->assertSeeIn('option:nth-child(2)', 'Year (e.g. Archive/2012)')
                                ->assertValue('option:nth-child(3)', 'month')
                                ->assertSeeIn('option:nth-child(3)', 'Month (e.g. Archive/2012/06)')
                                ->assertValue('option:nth-child(4)', 'tbmonth')
                                ->assertSeeIn('option:nth-child(4)', 'Month - Thunderbird compatible (e.g. Archive/2012/2012-06)')
                                ->assertValue('option:nth-child(5)', 'sender')
                                ->assertSeeIn('option:nth-child(5)', 'Sender email')
                                ->assertValue('option:nth-child(6)', 'folder')
                                ->assertSeeIn('option:nth-child(6)', 'Original folder');
                        });

                    $browser->select('_archive_type', 'year');
                });

                // Submit form
                if (!$browser->isPhone()) {
                    $browser->click('.formbuttons button.submit');
                }
            });

            if ($browser->isPhone()) {
                $browser->click('#layout-content .footer a.submit');
            }

            $browser->waitForMessage('confirmation', 'Successfully saved');

            // Verify if every option has been updated
            $browser->withinFrame('#preferences-frame', static function ($browser) {
                $browser->assertSelected('_archive_mbox', 'Drafts');
                $browser->assertSelected('_archive_type', 'year');
            });
        });
    }

    /**
     * Test Preferences UI (Server Settings)
     */
    public function testServerSettings()
    {
        $this->browse(static function ($browser) {
            $browser->go('settings', 'preferences');

            $browser->click('#sections-table tr.server');

            $browser->withinFrame('#preferences-frame', static function ($browser) {
                if (!$browser->isPhone()) {
                    $browser->waitFor('.formbuttons button.submit');
                }

                // Main Options fieldset
                $browser->with('form.propform fieldset.main', static function ($browser) {
                    $browser->assertSeeIn('label[for=ff_read_on_archive]', 'Mark the message as read on archive')
                        ->assertCheckboxState('_read_on_archive', false)
                        ->setCheckboxState('_read_on_archive', true);
                });

                // Submit form
                if (!$browser->isPhone()) {
                    $browser->click('.formbuttons button.submit');
                }
            });

            if ($browser->isPhone()) {
                $browser->click('#layout-content .footer a.submit');
            }

            $browser->waitForMessage('confirmation', 'Successfully saved');

            // Verify if every option has been updated
            $browser->withinFrame('#preferences-frame', static function ($browser) {
                $browser->assertCheckboxState('_read_on_archive', true);
            });
        });
    }
}
