require("luasnip.session.snippet_collection").clear_snippets("php")
require("luasnip.session.snippet_collection").clear_snippets("yaml")

local ls = require("luasnip")

local s = ls.snippet
local t = ls.text_node

local fmt = require("luasnip.extras.fmt").fmt
local fmta = require("luasnip.extras.fmt").fmta

ls.add_snippets("php", {
  s(
    "createnodes",
    fmt(
      [[
        $this->createNode(['type' => 'talk']);
        $this->createNode(['type' => 'talk']);
      ]],
      {}
    )
  ),

  s(
    "pagecontroller",
    fmta(
      [[
        <<?php

        declare(strict_types=1);

        namespace Drupal\opdavies_talks\Controller;

        final class TalksPageController {

          public function __invoke(): array {
            return [];
          }

        }
        ]],
      {}
    )
  ),

  s(
    "repocount",
    fmt(
      [[
        public function __construct(private EntityTypeManagerInterface $entityTypeManager) {{
        }}

        public function getCount(): int {{
          $talks = $this->entityTypeManager->getStorage('node')->loadByProperties();

          return count($talks);
        }}
      ]],
      {}
    )
  ),

  s(
    "repotestclass",
    fmta(
      [[
      <<?php

      namespace Drupal\Tests\opdavies_talks\Kernel\Repository;

      use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;

      final class TalkNodeRepositoryTest extends EntityKernelTestBase {

        protected static $modules = ['opdavies_talks'];

      }
      ]],
      {}
    )
  ),

  s(
    "repotestcount",
    fmt(
      [[
        public function test_it_returns_a_count(): void {{
          $talkRepository = $this->container->get(TalkNodeRepository::class);

          self::assertSame(2, $talkRepository->getCount());
        }}
      ]],
      {}
    )
  ),

  s(
    "showconstructor",
    fmta(
      [[
      public function __construct(private TalkNodeRepository $talkRepository) {
      }
      ]],
      {}
    )
  ),

  s(
    "showcount",
    fmt(
      [[
        $talkCount = 2;

        return ['#markup' => $this->t('<span data-talk-count>:count talks</span>', [':count' => $talkCount])];
      ]],
      {}
    )
  ),

  s("showrepository", t("$talkCount = $this->talkRepository->getCount();")),

  s(
    "test200response",
    fmt(
      [[
        public function test_it_returns_a_200_response_code(): void {{
          $this->drupalGet('/talks');

          $session = $this->assertSession();
          $session->statusCodeEquals(Response::HTTP_OK);
        }}
      ]],
      {}
    )
  ),

  s(
    "testclass",
    fmt(
      [[
        <?php

        namespace Drupal\Tests\opdavies_talks\Functional;

        use Drupal\Tests\BrowserTestBase;

        class TalksPageTest extends BrowserTestBase {{

          public $defaultTheme = 'stark';

        }}
        ]],
      {}
    )
  ),

  s(
    "testcount",
    fmt(
      [[
        public function test_it_displays_the_talk_count(): void {{
          $this->drupalGet('/talks');

          $session = $this->assertSession();
          $session->responseContains('<span data-talk-count>2 talks</span>');
        }}
      ]],
      {}
    )
  ),

  s("testmodules", t("protected static $modules = ['opdavies_talks'];")),
})

ls.add_snippets("yaml", {
  s(
    "talkpage",
    fmt(
      [[
        opdavies_talks.page:
          path: /talks
          defaults:
            _controller: Drupal\opdavies_talks\Controller\TalksPageController
            _title: Talks
          requirements:
            _permission: access content
      ]],
      {}
    )
  ),

  s(
    "talkservices",
    fmt(
      [[
        services:
          Drupal\opdavies_talks\Controller\TalksPageController:
            autowire: true
          Drupal\opdavies_talks\Repository\TalkNodeRepository: []
      ]],
      {}
    )
  ),
})