import sys
import tempfile
import unittest
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[1]))

from inventario import extrair_actions, montar_url


def _cria(raiz: Path, rel: str, conteudo: str):
    p = raiz / rel
    p.parent.mkdir(parents=True, exist_ok=True)
    p.write_text(conteudo, encoding="utf8")


class InventarioTest(unittest.TestCase):
    def setUp(self):
        self.tmp = tempfile.TemporaryDirectory()
        self.raiz = Path(self.tmp.name)
        _cria(self.raiz, "modules/financial/controllers/TipoController.php",
              "<?php class TipoController {\n public function actionDadosOrdena($tipoId = null, $nivel) {}\n}")
        _cria(self.raiz, "modules/financial/controllers/BpTipoController.php",
              "<?php class BpTipoController {\n public function actionIndex() {}\n}")
        _cria(self.raiz, "controllers/LicencaController.php",
              "<?php class LicencaController {\n public function actionView($id) {}\n public function actionFindCliente($q, $t = null) {}\n}")
        _cria(self.raiz, "modules/operational-old/controllers/DashboardController.php",
              "<?php class DashboardController {\n public function actionIndex() {}\n}")
        _cria(self.raiz, "modules/operational/modules/configuracoes/controllers/TipoController.php",
              "<?php class TipoController {\n public function actionIndex() {}\n}")
        self.acoes = extrair_actions(self.raiz)

    def tearDown(self):
        self.tmp.cleanup()

    def _acha(self, modulo, controller, action):
        return [a for a in self.acoes if (a["modulo"], a["controller_id"], a["action_id"]) == (modulo, controller, action)]

    def test_parametro_opcional_antes_de_obrigatorio(self):
        a = self._acha("financial", "tipo", "dados-ordena")[0]
        self.assertEqual(a["params"], [{"nome": "tipoId", "default": True}, {"nome": "nivel", "default": False}])

    def test_controller_raiz_sem_modulo(self):
        self.assertEqual(len(self._acha(None, "licenca", "view")), 1)

    def test_camelcase_para_id(self):
        self.assertEqual(len(self._acha("financial", "bp-tipo", "index")), 1)
        self.assertEqual(len(self._acha(None, "licenca", "find-cliente")), 1)

    def test_modulo_nao_registrado_fica_fora(self):
        self.assertEqual([a for a in self.acoes if a["modulo"] == "operational-old"], [])

    def test_submodulo_configuracoes(self):
        self.assertEqual(len(self._acha("configuracoes", "tipo", "index")), 1)

    def test_montar_url(self):
        self.assertEqual(montar_url("financial", "tipo", "dados-ordena", {"tipoId": 3, "nivel": 1}),
                         "/financial/tipo/dados-ordena?tipoId=3&nivel=1")
        self.assertEqual(montar_url(None, "site", "index", {}), "/site/index")


if __name__ == "__main__":
    unittest.main()
