package logic

import (
	"errors"
	"exhibition-register/internal/dao"
	"exhibition-register/internal/model"
	"exhibition-register/pb/exhibition"
	"exhibition-register/pkg/utils"
	"fmt"
)

type IRegister interface {
	CheckByPhone(in *exhibition.RegisterInfo) (out *exhibition.CheckPhoneResp, err error)
	CheckIdCard(in *exhibition.RegisterInfo) (out *exhibition.CheckIdCardResp, err error)
	SaveRegisterRecord(in *exhibition.RegisterInfo) (out *exhibition.SaveRegisterRecordResp, err error)
	RegisterRecordList(in *exhibition.RecordListReq) (out *exhibition.RecordListResp, err error)
	FindAllRecord() (out *exhibition.ExportRecordResp, err error)
}

func NewRegister() IRegister {
	return &Register{}
}

type Register struct {
}

func (r *Register) CheckIdCard(in *exhibition.RegisterInfo) (out *exhibition.CheckIdCardResp, err error) {
	out = &exhibition.CheckIdCardResp{}
	check, err1 := dao.CheckBy("id_card", in.IdCard, "")
	if err1 != nil {
		return nil, err1
	}
	if check != nil {
		return nil, errors.New("该身份证号已被" + check.PhoneNum + "注册!")
	}
	return out, nil
}

func (r *Register) FindAllRecord() (out *exhibition.ExportRecordResp, err error) {
	out = &exhibition.ExportRecordResp{}
	allRecord, err := dao.AllRecord()
	if err != nil {
		return nil, err
	}
	if len(allRecord) > 0 {
		for _, record := range allRecord {
			var address string
			address = fmt.Sprintf("%s%s", record.Address, record.Address1)
			tmp := &exhibition.ExportInfo{
				ArtistName:      record.ArtistName,
				Gender:          record.Gender,
				PhoneNum:        record.PhoneNum,
				IdCard:          record.IdCard,
				Address:         address,
				IdCardPhoto:     record.IdCardPhoto,
				IdCardBackPhoto: record.IdCardBackPhoto,
				ArtistPhoto:     record.ArtistPhoto,
				CreatedAt:       record.CreatedAt.Format("2006-01-02 15:04:05"),
				UpdatedAt:       record.UpdatedAt.Format("2006-01-02 15:04:05"),
			}
			out.Data = append(out.Data, tmp)
		}
	}

	return
}

func (r *Register) RegisterRecordList(in *exhibition.RecordListReq) (out *exhibition.RecordListResp, err error) {
	out = &exhibition.RecordListResp{}
	recordList, total, err := dao.RecordList(in)
	if err != nil {
		return nil, err
	}
	if total > 0 {
		for _, item := range recordList {
			tmp := &exhibition.RegisterInfo{
				Id:              int32(item.ID),
				Uuid:            item.UUID,
				ArtistName:      item.ArtistName,
				Gender:          item.Gender,
				PhoneNum:        item.PhoneNum,
				IdCard:          item.IdCard,
				Address:         item.Address,
				Address1:        item.Address1,
				IdCardPhoto:     item.IdCardPhoto,
				IdCardBackPhoto: item.IdCardBackPhoto,
				ArtistPhoto:     item.ArtistPhoto,
				ArtworkFile:     item.ArtworkFile,
				CreatedAt:       item.CreatedAt.Format("2006-01-02 15:04:05"),
				UpdatedAt:       item.UpdatedAt.Format("2006-01-02 15:04:05"),
			}
			out.Data = append(out.Data, tmp)

		}
		out.Count = int32(total)
	}
	return out, err
}

func (r *Register) SaveRegisterRecord(in *exhibition.RegisterInfo) (out *exhibition.SaveRegisterRecordResp, err error) {
	out = &exhibition.SaveRegisterRecordResp{}
	record := &model.RegisterRecord{
		ArtistName:      in.ArtistName,
		Gender:          in.Gender,
		PhoneNum:        in.PhoneNum,
		IdCard:          in.IdCard,
		Address:         in.Address,
		Address1:        in.Address1,
		IdCardPhoto:     in.IdCardPhoto,
		IdCardBackPhoto: in.IdCardBackPhoto,
		ArtistPhoto:     in.ArtistPhoto,
		ArtworkFile:     in.ArtworkFile,
	}

	tmpRecord := &model.RegisterRecord{}
	if in.Uuid != "" {
		check, err := dao.CheckBy("phone_num", record.PhoneNum, in.Uuid)
		if err != nil {
			return nil, err
		}
		if check != nil {
			return nil, errors.New("该手机号已经被注册!")
		}
		record.UUID = in.Uuid
		registerRecord, err1 := dao.UpdateRegisterRecord(record)
		if err1 != nil {
			return nil, err1
		}
		tmpRecord = registerRecord

	} else {
		record.UUID = utils.GetUUID()
		registerRecord, err := dao.CreateRegisterRecord(record)
		if err != nil {
			return nil, err
		}
		tmpRecord = registerRecord
	}

	data := &exhibition.RegisterInfo{
		Id:              int32(tmpRecord.ID),
		Uuid:            tmpRecord.UUID,
		ArtistName:      tmpRecord.ArtistName,
		Gender:          tmpRecord.Gender,
		PhoneNum:        tmpRecord.PhoneNum,
		IdCard:          tmpRecord.IdCard,
		Address:         tmpRecord.Address,
		Address1:        tmpRecord.Address1,
		IdCardPhoto:     tmpRecord.IdCardPhoto,
		IdCardBackPhoto: tmpRecord.IdCardBackPhoto,
		ArtistPhoto:     tmpRecord.ArtistPhoto,
		ArtworkFile:     tmpRecord.ArtworkFile,
		CreatedAt:       tmpRecord.CreatedAt.Format("2006-01-02 15:04:05"),
		UpdatedAt:       tmpRecord.UpdatedAt.Format("2006-01-02 15:04:05"),
	}
	out.Data = data
	return out, nil
}

// CheckByPhone 通过手机号检索 存在的就返回数据
func (r *Register) CheckByPhone(in *exhibition.RegisterInfo) (out *exhibition.CheckPhoneResp, err error) {
	out = &exhibition.CheckPhoneResp{}
	record, err := dao.CheckByPhone(in.PhoneNum)
	if err != nil {
		return nil, err
	}
	if record == nil {
		out.IsExist = false
		return out, nil
	}
	data := &exhibition.RegisterInfo{
		Id:              int32(record.ID),
		Uuid:            record.UUID,
		ArtistName:      record.ArtistName,
		Gender:          record.Gender,
		PhoneNum:        record.PhoneNum,
		IdCard:          record.IdCard,
		Address:         record.Address,
		Address1:        record.Address1,
		IdCardPhoto:     record.IdCardPhoto,
		IdCardBackPhoto: record.IdCardBackPhoto,
		ArtistPhoto:     record.ArtistPhoto,
		ArtworkFile:     record.ArtworkFile,
		CreatedAt:       record.CreatedAt.Format("2006-01-02 15:04:05"),
		UpdatedAt:       record.UpdatedAt.Format("2006-01-02 15:04:05"),
	}
	out.Data = data
	out.IsExist = true

	return out, nil
}