package service

import (
	"github.com/labstack/echo/v4"
)

type QueryResponse struct {
	Names        []string `json:"names"`
	Nicknames    []string `json:"nicknames"`
	PhoneNumbers []string `json:"phone_numbers"`
	IDNumbers    []string `json:"id_numbers"`
	QQNumbers    []string `json:"qq_numbers"`
	Passwords    []string `json:"passwords"`
	Emails       []string `json:"emails"`
	Addresses    []string `json:"addresses"`
}

func NewQueryResponse() *QueryResponse {
	return &QueryResponse{
		Names:        make([]string, 0),
		Nicknames:    make([]string, 0),
		PhoneNumbers: make([]string, 0),
		IDNumbers:    make([]string, 0),
		QQNumbers:    make([]string, 0),
		Passwords:    make([]string, 0),
		Emails:       make([]string, 0),
		Addresses:    make([]string, 0),
	}
}

func (svc *Service) queryHandlerFunc(ctx echo.Context) error {
	value := ctx.QueryParam("value")
	if value == "" {
		return InvalidParameterError
	}
	result := NewQueryResult()
	types := whatType(value)
	for _, t := range types {
		switch value := t.(type) {
		case QQNumber:
			result.addQQNumber(int64(value))
		case PhoneNumber:
			result.addPhoneNumber(int64(value))
		case Email:
			result.addEmail(string(value))
		case IDNumber:
			result.addIDNumber(string(value))
		}
	}
	ok := false
	for !ok {
		for qqNumber, checked := range result.QQNumbers {
			if !checked {
				if err := result.queryQQNumber(svc.databases, int64(qqNumber)); err != nil {
					return err
				}
			}
			continue
		}
		for phoneNumber, checked := range result.PhoneNumbers {
			if !checked {
				if err := result.queryPhoneNumber(svc.databases, int64(phoneNumber)); err != nil {
					return err
				}
			}
			continue
		}
		for idNumber, checked := range result.IDNumbers {
			if !checked {
				if err := result.queryIDNumber(svc.databases, string(idNumber)); err != nil {
					return err
				}
			}
			continue
		}
		for email, checked := range result.Emails {
			if !checked {
				if err := result.queryEmail(svc.databases, string(email)); err != nil {
					return err
				}
			}
			continue
		}
		ok = true
	}
	return NewResponse(ctx, nil, result.Build(svc.config.Mask))
}