package routers

import (
	"log/slog"

	"git.kocoder.xyz/kocoded/vt/model"
	"git.kocoder.xyz/kocoded/vt/query"
	"github.com/gofiber/fiber/v2"
)

type ansprechpartnerRouter struct {
	logger *slog.Logger
}

func RegisterAnsprechpartnerRouter(group fiber.Router, logger *slog.Logger) {
	router := &ansprechpartnerRouter{logger: logger}

	group.Post("/new", router.createAnsprechpartner)
	group.Get("/all", router.getAllAnsprechpartners)
	group.Get("/:id<int>", router.getAnsprechpartner)
	group.Get("/:id<int>/firmen", router.getAnsprechpartnerFirmen)
	group.Put("/:id<int>", router.updateAnsprechpartner)
	group.Delete("/:id<int>", router.deleteAnsprechpartner)
}

func (r *ansprechpartnerRouter) createAnsprechpartner(c *fiber.Ctx) error {
	ansprechpartner := new(model.Ansprechpartner)

	if err := c.BodyParser(ansprechpartner); err != nil {
		return err
	}

	ap := query.Ansprechpartner

	if err := ap.Omit(ap.UpdatedAt, ap.DeletedAt).Create(ansprechpartner); err != nil {
		return err
	}

	return c.SendString("Hello")
}

func (r *ansprechpartnerRouter) getAllAnsprechpartners(c *fiber.Ctx) error {
	aps, err := query.Ansprechpartner.Find()
	if err != nil {
		return err
	}

	err = c.JSON(aps)

	if err != nil {
		return err
	}
	return nil
}

func (r *ansprechpartnerRouter) getAnsprechpartner(c *fiber.Ctx) error {
	id, err := c.ParamsInt("id")

	if err != nil {
		return err
	}

	ap, err := query.Ansprechpartner.Where(query.Ansprechpartner.ID.Eq(uint(id))).First()
	if err != nil {
		return err
	}

	return c.JSON(ap)
}

func (r *ansprechpartnerRouter) getAnsprechpartnerFirmen(c *fiber.Ctx) error {
	id, err := c.ParamsInt("id")

	if err != nil {
		return err
	}

	ap, err := query.Ansprechpartner.Where(query.Ansprechpartner.ID.Eq(uint(id))).First()
	if err != nil {
		return err
	}

	firmen, err := query.Ansprechpartner.Firmen.Model(ap).Find()
	if err != nil {
		return err
	}

	ap.Firmen = firmen

	return c.JSON(ap)
}

func (r *ansprechpartnerRouter) updateAnsprechpartner(c *fiber.Ctx) error {
	ansprechpartner := new(model.Ansprechpartner)
	id, err := c.ParamsInt("id")

	if err != nil {
		return err
	}

	if err = c.BodyParser(ansprechpartner); err != nil {
		return err
	}

	ap := query.Ansprechpartner

	res, err := ap.Where(ap.ID.Eq(uint(id))).Omit(ap.ID, ap.CreatedAt, ap.UpdatedAt, ap.DeletedAt).Updates(ansprechpartner)
	if err != nil {
		return err
	}

	return c.JSON(res)
}

func (r *ansprechpartnerRouter) deleteAnsprechpartner(c *fiber.Ctx) error {
	id, err := c.ParamsInt("id")

	if err != nil {
		return err
	}

	res, err := query.Ansprechpartner.Where(query.Ansprechpartner.ID.Value(uint(id))).Delete()
	if err != nil {
		return err
	}

	return c.JSON(res)
}
