package mysql

import (
	"context"

	"gorm.io/gorm"

	v1 "github.com/pingcap-inc/security/model/v1"
)

type company struct {
	db *gorm.DB
}

func newCompany(ds *datastore) *company {
	return &company{db: ds.db}
}

func (c *company) CreateCompany(_ context.Context, records []v1.Company) error {
	if len(records) == 0 {
		return nil
	}

	err := c.db.Create(records).Error

	return err
}
func (c *company) CreateCompanyOne(_ context.Context, record v1.Company) error {
	err := c.db.Create(&record).Error

	return err
}

func (c *company) ListCompany(_ context.Context) (records []v1.Company, err error) {
	err = c.db.Find(&records).Error
	return
}

func (c *company) GetCompany(_ context.Context, name, country string) (record []*v1.Company, err error) {
	pre := c.db.Where("name like ?", "%"+name+"%")
	if country != "" {
		pre = pre.Where("country = ?", country)
	}
	// pre = pre.Where("status = ?", 1)
	err = pre.Find(&record).Error
	return
}

func (c *company) ListCompanyByStatus(_ context.Context, status int) (records []*v1.Company, err error) {
	err = c.db.Where("status = ?", status).Find(&records).Error
	return
}

func (c *company) UpdateCompanyStatus(_ context.Context, record *v1.Company) error {
	err := c.db.Save(record).Error

	return err
}

func (c *company) SaveComProblem(_ context.Context, record *v1.CompanyProblem) error {
	err := c.db.Save(record).Error

	return err
}

func (c *company) ListComProblem(_ context.Context) (records []v1.CompanyProblem, err error) {
	err = c.db.Find(&records).Error
	return
}

func (c *company) GetComProblem(_ context.Context, name string) (record *v1.CompanyProblem, err error) {
	err = c.db.Where("company_name = ?", name).First(&record).Error
	return
}

func (c *company) ListSanction(_ context.Context) (records []v1.CompanySanction, err error) {
	err = c.db.Find(&records).Error
	return
}

func (c *company) CreateSanction(_ context.Context, records []v1.CompanySanction) error {
	if len(records) == 0 {
		return nil
	}

	err := c.db.Save(records).Error

	return err
}

func (c *company) SaveSanction(_ context.Context, record *v1.CompanySanction) (uint64, error) {
	err := c.db.Save(record).Error

	return record.ID, err
}

func (c *company) ListCompanyOthers(_ context.Context) (records []v1.CompanyBasic, err error) {
	err = c.db.Find(&records).Error
	return
}

func (c *company) CreateCompanyOthers(_ context.Context, records []v1.CompanyBasic) error {
	if len(records) == 0 {
		return nil
	}

	err := c.db.Save(records).Error

	return err
}

func (c *company) SaveCompanyBasic(_ context.Context, record *v1.CompanyBasic) error {
	err := c.db.Save(record).Error

	return err
}

func (c *company) SaveSanctionReferences(_ context.Context, record []v1.CompanySanctionReferences) error {
	if len(record) == 0 {
		return nil
	}

	err := c.db.Save(record).Error

	return err
}

func (c *company) ListSanctionReferences(_ context.Context) (records []v1.CompanySanctionReferences, err error) {
	err = c.db.Find(&records).Error
	return
}

func (c *company) ListAllByCompanyIDs(_ context.Context, comIDs []uint64) (ci []*v1.CompanyProblem, cs []*v1.CompanySanction, csr []*v1.CompanySanctionReferences, co []*v1.CompanyBasic, err error) {
	err = c.db.Where("company_id IN ?", comIDs).Find(&ci).Error
	if err != nil {
		return
	}

	err = c.db.Where("company_id IN ?", comIDs).Find(&cs).Error
	if err != nil {
		return
	}

	err = c.db.Where("company_id IN ?", comIDs).Find(&csr).Error
	if err != nil {
		return
	}

	err = c.db.Where("company_id IN ?", comIDs).Find(&co).Error
	if err != nil {
		return
	}

	return
}

func (c *company) SaveUserLog(_ context.Context, record *v1.UserLog) error {
	err := c.db.Save(record).Error

	return err
}
