package gmodel

import (
	"context"

	"fmt"
	"regexp"
	"strings"

	"github.com/zeromicro/go-zero/core/logx"
)

type PreLogoSearchResult struct {
	Id             int64   `gorm:"primary_key;default:0;auto_increment;" json:"id"` // 自增的唯一id
	RestaurantName *string `gorm:"index;default:'';" json:"restaurant_name"`        //
	ResourceUrl    *string `gorm:"default:'';" json:"resource_url"`                 //
	RestaurantType *string `gorm:"default:'';" json:"restaurant_type"`              //
	Address        *string `gorm:"default:'';" json:"address"`                      //
	ZipCode        *string `gorm:"default:'';" json:"zip_code"`                     //
	Phone          *string `gorm:"default:'';" json:"phone"`                        //
	Website        *string `gorm:"default:'';" json:"website"`                      //
	IsBranch       *int64  `gorm:"default:0;" json:"is_branch"`                     // 是否分店
}

// TODO: 使用model的属性做你想做的

// 搜索
func (p *FsPreprocessLogoModel) PreLogoSearch(ctx context.Context, zipcode string, keywordsStr string, count int) (resp []PreLogoSearchResult, err error) {
	keywordsList := SplitSearchKeywords(keywordsStr)
	var keywords []string
	for _, v := range keywordsList {
		if len(v) > 1 {
			keywords = append(keywords, "+"+v+"*")
		}
	}

	if len(keywords) != 0 {

		sqlstr := fmt.Sprintf("SELECT id,restaurant_name,resource_url,address,zip_code,phone,website,is_branch FROM fs_preprocess_logo WHERE MATCH(restaurant_name) AGAINST(? IN BOOLEAN MODE) and zip_code = ? limit %d;", count)

		tx := p.db.WithContext(ctx).Model(&FsPreprocessLogo{}).Raw(sqlstr, strings.Join(keywords, " "), zipcode)
		err = tx.Scan(&resp).Error
		if err != nil {
			logx.Error(err)
			return nil, err
		}

		for i := range resp {
			if resp[i].RestaurantType == nil {
				resp[i].RestaurantType = FsString("")
			}

		}
	}

	if resp == nil {
		resp = make([]PreLogoSearchResult, 0)
	}

	return resp, nil
}

func SplitSearchKeywords(keywordsStr string) []string {
	return regexp.MustCompile(`\s+|\++`).Split(keywordsStr, -1)
}

// 搜索建议
func (p *FsPreprocessLogoModel) PreLogoSearchSuggestions(ctx context.Context, keywordsStr string, count int) (resp []PreLogoSearchResult, err error) {
	// keywordsList := regexp.MustCompile(`\s+|\++`).Split(keywordsStr, -1)
	keywordsList := SplitSearchKeywords(keywordsStr)
	var keywords []string
	for _, v := range keywordsList {
		if len(v) > 1 {
			keywords = append(keywords, "+"+v+"*")
		}
	}

	if len(keywords) != 0 {
		sqlstr := fmt.Sprintf("SELECT id,restaurant_name,resource_url,address,zip_code,phone,website,is_branch FROM fs_preprocess_logo WHERE MATCH(restaurant_name) AGAINST(? IN BOOLEAN MODE) limit %d;", count)

		tx := p.db.WithContext(ctx).Model(&FsPreprocessLogo{}).Raw(sqlstr, strings.Join(keywords, " "))
		err = tx.Scan(&resp).Error
		if err != nil {
			logx.Error(err)
			return nil, err
		}

		for i := range resp {
			if resp[i].RestaurantType == nil {
				resp[i].RestaurantType = FsString("")
			}

		}

	}

	if resp == nil {
		resp = make([]PreLogoSearchResult, 0)
	}

	return resp, nil
}