package service

import (
	"encoding/json"
	"errors"

	"pure/global"
	"pure/model"
	"pure/model/request"
	"pure/model/response"
)

func GetUserAddressList(userID string, info *request.ReqAddress) (error, any) {
	var (
		err  error
		list []model.Address
	)
	db := global.MG_DB.Model(&model.Address{}).Where("user_id=?", userID)
	if info.ID != 0 {
		db = db.Where("id=?", info.ID)
	}
	err = db.Find(&list).Error
	if err != nil {
		return errors.New("获取收货地址失败"), nil
	}
	return nil, list
}

func AddUserAddressList(userID string, data *model.Address) error {
	var (
		err error
	)
	data.UserID = userID
	if data.FirstName == "" || data.LastName == "" || data.Bldg == "" || data.City == "" || data.Street == "" || data.State == "" || data.ZipCode == "" {
		return errors.New("有必填项未填写")
	}
	if len(data.FirstName) > 255 {
		return errors.New("FirstName长度超出限制")
	}
	if len(data.LastName) > 255 {
		return errors.New("LastName长度超出限制")
	}
	if len(data.Street) > 255 {
		return errors.New("Street长度超出限制")
	}
	if len(data.Bldg) > 255 {
		return errors.New("Bldg长度超出限制")
	}
	if len(data.City) > 255 {
		return errors.New("City长度超出限制")
	}
	if len(data.State) > 255 {
		return errors.New("State长度超出限制")
	}
	if len(data.ZipCode) > 255 {
		return errors.New("ZipCode长度超出限制")
	}
	if len(data.Phone) > 20 {
		return errors.New("Phone长度超出限制")
	}
	if data.Default == 1 {
		global.MG_DB.Model(&model.Address{}).Where("user_id=?", userID).Update("default", 2)
	}
	err = global.MG_DB.Model(&model.Address{}).Create(data).Error
	if err != nil {
		return errors.New("添加收货地址失败")
	}
	return nil
}

func UpdateAddress(userID string, data *model.Address) error {
	var (
		err error
	)
	if data.FirstName == "" || data.LastName == "" || data.Bldg == "" || data.City == "" || data.Street == "" || data.State == "" || data.ZipCode == "" {
		return errors.New("有必填项未填写")
	}
	if len(data.FirstName) > 255 {
		return errors.New("FirstName长度超出限制")
	}
	if len(data.LastName) > 255 {
		return errors.New("LastName长度超出限制")
	}
	if len(data.Street) > 255 {
		return errors.New("Street长度超出限制")
	}
	if len(data.Bldg) > 255 {
		return errors.New("Bldg长度超出限制")
	}
	if len(data.City) > 255 {
		return errors.New("City长度超出限制")
	}
	if len(data.State) > 255 {
		return errors.New("State长度超出限制")
	}
	if len(data.ZipCode) > 255 {
		return errors.New("ZipCode长度超出限制")
	}
	if len(data.Phone) > 20 {
		return errors.New("Phone长度超出限制")
	}
	data.UserID = userID
	if data.Default == 1 {
		global.MG_DB.Model(&model.Address{}).Where("user_id=?", userID).Update("default", 2)
	}
	err = global.MG_DB.Model(&model.Address{}).Where("user_id=? and id=?", userID, data.ID).Updates(data).Error
	if err != nil {
		return errors.New("修改收货地址失败")
	}
	return nil
}

func DeleteAddress(userID string, ID *global.BASE_ID) error {
	var (
		err error
	)
	err = global.MG_DB.Model(&model.Address{}).Where("user_id=? and id=?", userID, ID.ID).Delete(&model.Address{}).Error
	if err != nil {
		return errors.New("删除收货地址失败")
	}
	return nil
}

func GetUsSelect() (error, any) {
	var (
		err  error
		list []model.UsSelect
		data []model.UsCitys
	)
	err = global.MG_DB.Model(&model.UsStates{}).Find(&list).Error
	if err != nil {
		return errors.New("获取地址失败"), nil
	}
	err = global.MG_DB.Model(&model.UsCitys{}).Find(&data).Error
	if err != nil {
		return errors.New("获取地址失败"), nil
	}
	for v := range list {
		for x := range data {
			if data[x].IDState == list[v].ID {
				list[v].Child = append(list[v].Child, data[x])
			}
		}
	}
	return nil, list
}

func GetTrack(trackId int64) ([]response.TrackItem, error) {
	var list []response.TrackItem
	var values []model.TrackValue
	var track model.Track
	err := global.MG_DB.Model(&model.Track{}).Where("id=?", trackId).First(&track).Error
	if err != nil {
		return list, err
	}
	err = json.Unmarshal([]byte(track.Value), &values)
	if err != nil {
		return list, err
	}
	for _, v := range values {
		list = append(list, response.TrackItem{
			CheckpointDate:   v.CheckpointDate,
			DeliveryStatus:   v.CheckpointDeliveryStatus,
			TrackingDetail:   v.TrackingDetail,
			DeliveryStatusCn: toDeliveryStatus(v.CheckpointDeliveryStatus),
		})
	}
	return list, nil
}

func toDeliveryStatus(status string) string {
	switch status {
	case "transit":
		return "运输途中"
	case "pickup":
		return "到达待取"
	case "delivered":
		return "已签收"
	}
	return ""
}