package models

// Location holds latitude and longitude.
type Location struct {
	Lat float64 `json:"lat"`
	Lon float64 `json:"lon"`
}

// ImportantInfo holds fields that are important for quick access.
type SensorData struct {
	IMEI        string            `json:"imei"`
	IMSI        string            `json:"imsi"`
	Timestamp   int64             `json:"timestamp"`
	Lat         float64           `json:"lat"`
	Lon         float64           `json:"lon"`
	WifiLoc     Location          `json:"wifiLocation"`
	CellLoc     Location          `json:"cellLocation"`
	Temperature float64           `json:"temperature"`
	AccInfo     AccelerometerInfo `json:"accelerometerInfo"`
	AccelerometerInfo
}

type DeviceInfo struct {
	BaseModel
	RawJSON string `json:"raw_json" gorm:"type:json"`
	SensorData
	DeviceID         uint
	ExternalDeviceID string `json:"deviceId"`
}

type DeviceInfoResponse struct {
	BaseModel
	RawJSON string `json:"rawJson" gorm:"type:json"`
	SensorData
	DeviceID         uint   `json:"deviceId"`
	ExternalDeviceID string `json:"externalDeviceId"`
}

type NormalAndBreachedDevicesResponse struct {
	Breached int64	`json:"breached"`
	Normal int64	    `json:"normal"`
	MonthlyCounts map[string]map[string]int64 `json:"monthly_counts"`
}

func ConvertDeviceInfoToResponse(deviceInfos []DeviceInfo) []DeviceInfoResponse {
	var deviceInfoResponses []DeviceInfoResponse
	for _, deviceInfo := range deviceInfos {
		deviceInfoResponse := DeviceInfoResponse{
			BaseModel: BaseModel{
				ID:        deviceInfo.ID,
				CreatedAt: deviceInfo.CreatedAt,
				UpdatedAt: deviceInfo.UpdatedAt,
			},
			RawJSON:          deviceInfo.RawJSON,
			SensorData:       deviceInfo.SensorData,
			DeviceID:         deviceInfo.DeviceID,
			ExternalDeviceID: deviceInfo.ExternalDeviceID,
		}
		deviceInfoResponses = append(deviceInfoResponses, deviceInfoResponse)
	}
	return deviceInfoResponses
}

type AccelerometerInfo struct {
	X int64 `json:"x"`
	Y int64 `json:"y"`
	Z int64 `json:"z"`
}
type GeoJSONFeatureCollection struct {
	Type     string           `json:"type"`
	Features []GeoJSONFeature `json:"features"`
}

type GeoJSONFeature struct {
	Type               string                 `json:"type"`
	Geometry           GeoJSONGeometry        `json:"geometry"`
	DeviceInfoResponse *DeviceInfoResponse    `json:"deviceInfo,omitempty"`
	Properties         map[string]interface{} `json:"properties"`
}

type GeoJSONGeometry struct {
	Type        string    `json:"type"`
	Coordinates []float64 `json:"coordinates"`
}

func (DeviceInfo) Update() (bool, error) {
	return false, nil
}
func (DeviceInfo) Create() (bool, error) {
	return false, nil
}
func (DeviceInfo) Delete() (bool, error) {
	return false, nil
}
