package company

import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"

	srvv1 "github.com/pingcap-inc/security/internal/alert-server/service/v1"
	"github.com/pingcap-inc/security/internal/alert-server/store"
	v1 "github.com/pingcap-inc/security/model/v1"
	"github.com/pingcap-inc/security/pkg/errors"
	"github.com/pingcap-inc/security/pkg/log"
	"github.com/pingcap-inc/security/pkg/util/ginres"
)

type WebServiceController struct {
	srv srvv1.Service
}

func NewWebServiceController(store store.Factory) *WebServiceController {
	return &WebServiceController{
		srv: srvv1.NewService(store),
	}
}

func (g *WebServiceController) CompanyBasic(c *gin.Context) {
	log.L(c).Infof("start get company basic list")

	var list v1.CompanySearchList

	// get params
	if err := c.ShouldBindQuery(&list); err != nil {
		ginres.WriteResponse(c, errors.New("params error"), nil)
		return
	}

	// page is null
	if list.Page == 0 {
		list.Page = 1
	}
	if list.PageSize == 0 {
		list.PageSize = 10
	}

	data, err := g.srv.WebService().CompanyBasic(c, list)
	if err != nil {
		ginres.WriteResponse(c, err, nil)
		return
	}

	ginres.WriteResponse(c, nil, data)

	log.L(c).Infof("end get cloud billing list")
}

func (g *WebServiceController) Company(c *gin.Context) {
	log.L(c).Infof("start get company list")

	var list v1.CompanySearchList

	// get params
	if err := c.ShouldBindQuery(&list); err != nil {
		ginres.WriteResponse(c, errors.New("params error"), nil)
		return
	}

	// page is null
	if list.Page == 0 {
		list.Page = 1
	}
	if list.PageSize == 0 {
		list.PageSize = 10
	}

	data, err := g.srv.WebService().Company(c, list)
	if err != nil {
		ginres.WriteResponse(c, err, nil)
		return
	}

	ginres.WriteResponse(c, nil, data)

	log.L(c).Infof("end get company list")
}
func (g *WebServiceController) CompanyProblems(c *gin.Context) {
	log.L(c).Infof("start get company problems list")

	var list v1.CompanySearchList

	// get params
	if err := c.ShouldBindQuery(&list); err != nil {
		ginres.WriteResponse(c, errors.New("params error"), nil)
		return
	}

	// page is null
	if list.Page == 0 {
		list.Page = 1
	}
	if list.PageSize == 0 {
		list.PageSize = 10
	}

	data, err := g.srv.WebService().Problem(c, list)
	if err != nil {
		ginres.WriteResponse(c, err, nil)
		return
	}

	ginres.WriteResponse(c, nil, data)

	log.L(c).Infof("end get company problems list")
}

func (g *WebServiceController) CompanySanctions(c *gin.Context) {
	log.L(c).Infof("start get company sanctions list")

	var list v1.CompanySearchList

	// get params
	if err := c.ShouldBindQuery(&list); err != nil {
		ginres.WriteResponse(c, errors.New("params error"), nil)
		return
	}

	// page is null
	if list.Page == 0 {
		list.Page = 1
	}
	if list.PageSize == 0 {
		list.PageSize = 10
	}

	data, err := g.srv.WebService().Sanction(c, list)
	if err != nil {
		ginres.WriteResponse(c, err, nil)
		return
	}

	ginres.WriteResponse(c, nil, data)

	log.L(c).Infof("end get company sanctions list")
}

func (g *WebServiceController) CompanyReferences(c *gin.Context) {
	log.L(c).Infof("start get company references list")

	var list v1.CompanySearchList

	// get params
	if err := c.ShouldBindQuery(&list); err != nil {
		ginres.WriteResponse(c, errors.New("params error"), nil)
		return
	}

	// page is null
	if list.Page == 0 {
		list.Page = 1
	}
	if list.PageSize == 0 {
		list.PageSize = 10
	}

	data, err := g.srv.WebService().Reference(c, list)
	if err != nil {
		ginres.WriteResponse(c, err, nil)
		return
	}

	ginres.WriteResponse(c, nil, data)

	log.L(c).Infof("end get company references list")
}

func (g *WebServiceController) CompanyInfoPrincipalsContacts(c *gin.Context) {
	log.L(c).Infof("start get company info principals contacts list")
	var list v1.CompanySearchList

	// get params
	if err := c.ShouldBindQuery(&list); err != nil {
		ginres.WriteResponse(c, errors.New("params error"), nil)
		return
	}

	// page is null
	if list.Page == 0 {
		list.Page = 1
	}
	if list.PageSize == 0 {
		list.PageSize = 10
	}

	user := getSessionUser(c)
	list.User = user

	data, err := g.srv.WebService().CompanyInfoPrincipalsContacts(c, list)
	if err != nil {
		ginres.WriteResponse(c, err, nil)
		return
	}

	ginres.WriteResponse(c, nil, data)

	log.L(c).Infof("end get company info principals contacts list")
}

func (g *WebServiceController) ResetCompanies(c *gin.Context) {
	log.L(c).Infof("start reset company list")

	user := getSessionUser(c)
	var list v1.CompanySearchList
	list.User = user

	err := g.srv.WebService().ResetCompanies(c, list)
	if err != nil {
		ginres.WriteResponse(c, err, nil)
		return
	}

	ginres.WriteResponse(c, nil, nil)

	log.L(c).Infof("end reset company list")
}

func (g *WebServiceController) FreshInformation(c *gin.Context) {
	log.L(c).Infof("start fresh company information")

	user := getSessionUser(c)

	var list v1.CompanySearchList

	// get params
	if err := c.ShouldBindQuery(&list); err != nil {
		ginres.WriteResponse(c, errors.New("params error"), nil)
		return
	}

	if list.CompanyID == 0 && list.CompanyName == "" {
		ginres.WriteResponse(c, errors.New("company id error"), nil)
		return
	}

	list.User = user

	go g.srv.WebService().FreshInformation(c, list)

	ginres.WriteResponse(c, nil, nil)

	log.L(c).Infof("end fresh company information")
}

func getSessionUser(c *gin.Context) string {
	session := sessions.Default(c)
	name := session.Get("name")
	if name == nil {
		email := session.Get("email")
		return email.(string)
	}
	// sessionInfo

	return name.(string)
}
