package services

import (
	"context"
	"encoding/json"
	"github.com/TeaOSLab/EdgeAPI/internal/db/models/regions"
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)

// RegionCountryService 国家相关服务
type RegionCountryService struct {
	BaseService
}

// FindAllEnabledRegionCountries 查找所有的国家列表
// Deprecated
func (this *RegionCountryService) FindAllEnabledRegionCountries(ctx context.Context, req *pb.FindAllEnabledRegionCountriesRequest) (*pb.FindAllEnabledRegionCountriesResponse, error) {
	// 校验请求
	_, _, err := this.ValidateNodeId(ctx)
	if err != nil {
		return nil, err
	}

	var tx = this.NullTx()

	countries, err := regions.SharedRegionCountryDAO.FindAllEnabledCountriesOrderByPinyin(tx)
	if err != nil {
		return nil, err
	}

	result := []*pb.RegionCountry{}
	for _, country := range countries {
		pinyinStrings := []string{}
		err = json.Unmarshal(country.Pinyin, &pinyinStrings)
		if err != nil {
			return nil, err
		}
		if len(pinyinStrings) == 0 {
			continue
		}

		result = append(result, &pb.RegionCountry{
			Id:          int64(country.Id),
			Name:        country.Name,
			Codes:       country.DecodeCodes(),
			Pinyin:      pinyinStrings,
			CustomName:  country.CustomName,
			CustomCodes: country.DecodeCustomCodes(),
			DisplayName: country.DisplayName(),
		})
	}
	return &pb.FindAllEnabledRegionCountriesResponse{
		RegionCountries: result,
	}, nil
}

// FindEnabledRegionCountry 查找单个国家信息
// Deprecated
func (this *RegionCountryService) FindEnabledRegionCountry(ctx context.Context, req *pb.FindEnabledRegionCountryRequest) (*pb.FindEnabledRegionCountryResponse, error) {
	// 校验请求
	_, _, err := this.ValidateNodeId(ctx)
	if err != nil {
		return nil, err
	}

	var tx = this.NullTx()

	country, err := regions.SharedRegionCountryDAO.FindEnabledRegionCountry(tx, req.RegionCountryId)
	if err != nil {
		return nil, err
	}
	if country == nil {
		return &pb.FindEnabledRegionCountryResponse{RegionCountry: nil}, nil
	}

	return &pb.FindEnabledRegionCountryResponse{RegionCountry: &pb.RegionCountry{
		Id:          int64(country.Id),
		Name:        country.Name,
		Codes:       country.DecodeCodes(),
		CustomName:  country.CustomName,
		CustomCodes: country.DecodeCustomCodes(),
		DisplayName: country.DisplayName(),
	}}, nil
}

// FindAllRegionCountries 查找所有的国家列表
func (this *RegionCountryService) FindAllRegionCountries(ctx context.Context, req *pb.FindAllRegionCountriesRequest) (*pb.FindAllRegionCountriesResponse, error) {
	// 校验请求
	_, _, err := this.ValidateNodeId(ctx)
	if err != nil {
		return nil, err
	}

	var tx = this.NullTx()

	countries, err := regions.SharedRegionCountryDAO.FindAllEnabledCountriesOrderByPinyin(tx)
	if err != nil {
		return nil, err
	}

	var result = []*pb.RegionCountry{}
	for _, country := range countries {
		pinyinStrings := []string{}
		err = json.Unmarshal(country.Pinyin, &pinyinStrings)
		if err != nil {
			return nil, err
		}
		if len(pinyinStrings) == 0 {
			continue
		}

		result = append(result, &pb.RegionCountry{
			Id:          int64(country.Id),
			Name:        country.Name,
			Codes:       country.DecodeCodes(),
			Pinyin:      pinyinStrings,
			CustomName:  country.CustomName,
			CustomCodes: country.DecodeCustomCodes(),
			DisplayName: country.DisplayName(),
		})
	}
	return &pb.FindAllRegionCountriesResponse{
		RegionCountries: result,
	}, nil
}

// FindRegionCountry 查找单个国家信息
func (this *RegionCountryService) FindRegionCountry(ctx context.Context, req *pb.FindRegionCountryRequest) (*pb.FindRegionCountryResponse, error) {
	// 校验请求
	_, _, err := this.ValidateNodeId(ctx)
	if err != nil {
		return nil, err
	}

	var tx = this.NullTx()

	country, err := regions.SharedRegionCountryDAO.FindEnabledRegionCountry(tx, req.RegionCountryId)
	if err != nil {
		return nil, err
	}
	if country == nil {
		return &pb.FindRegionCountryResponse{RegionCountry: nil}, nil
	}

	return &pb.FindRegionCountryResponse{RegionCountry: &pb.RegionCountry{
		Id:          int64(country.Id),
		Name:        country.Name,
		Codes:       country.DecodeCodes(),
		CustomName:  country.CustomName,
		CustomCodes: country.DecodeCustomCodes(),
		DisplayName: country.DisplayName(),
	}}, nil
}

// UpdateRegionCountryCustom 修改城市定制信息
func (this *RegionCountryService) UpdateRegionCountryCustom(ctx context.Context, req *pb.UpdateRegionCountryCustomRequest) (*pb.RPCSuccess, error) {
	_, err := this.ValidateAdmin(ctx)
	if err != nil {
		return nil, err
	}

	var tx = this.NullTx()
	err = regions.SharedRegionCountryDAO.UpdateCountryCustom(tx, req.RegionCountryId, req.CustomName, req.CustomCodes)
	if err != nil {
		return nil, err
	}
	return this.Success()
}
