package foa

import "time"

type FoaOtaUpdateStatusRequest struct {
	OtaID         string      `json:"ota_id"`
	Status        string      `json:"status"`
	NotesToOwner  string      `json:"notes_to_owner"`
	InternalNotes string      `json:"internal_notes"`
	SuppressEmail bool        `json:"suppress_email"`
	Vin           string      `json:"vin"`
	AddlData      FoaAddlData `json:"addl_data"`
}

type FoaAddlData struct {
	FailureReason string `json:"failure_reason,omitempty"`
	OwnerAdvice   string `json:"owner_advice,omitempty"`
	DateScheduled string `json:"date_scheduled,omitempty"`
	CancelReason  string `json:"cancel_reason,omitempty"`
}

func BuildOtaUpdateStatusInProgressRequest(vin string, updateManifestID int64) FoaOtaUpdateStatusRequest {
	var req = FoaOtaUpdateStatusRequest{
		Vin:    vin,
		Status: "IN_PROGRESS",
	}

	switch updateManifestID {
	case 816:
		req.NotesToOwner = "Your Ocean is being updated to version 2.2 (1/3)"
	case 817, 818, 819:
		req.NotesToOwner = "Your Ocean is being updated to version 2.2 (2/3)"
	case 820:
		req.NotesToOwner = "Your Ocean is being updated to version 2.2 (3/3)"
	}

	return req
}

func BuildOtaUpdateStatusSuccessRequest(vin string, updateManifestID int64) FoaOtaUpdateStatusRequest {
	var req = FoaOtaUpdateStatusRequest{
		Vin:    vin,
		Status: "COMPLETE_SUCCESSFUL",
	}

	switch updateManifestID {
	case 816:
		req.NotesToOwner = "Your Ocean has successfully been updated to version 2.2 (1/3)"
	case 817, 818, 819:
		req.NotesToOwner = "Your Ocean has successfully been updated to version 2.2 (2/3)"
	case 820:
		req.NotesToOwner = "Your Ocean has successfully been updated to version 2.2 (3/3)"
	}

	return req
}

func BuildOtaUpdateStatusFailedRequest(vin string, updateManifestID int64, info string) FoaOtaUpdateStatusRequest {
	var req = FoaOtaUpdateStatusRequest{
		Vin:    vin,
		Status: "COMPLETE_FAILED",
		AddlData: FoaAddlData{
			FailureReason: "Update failed because of an error",
			OwnerAdvice:   info,
		},
	}

	switch updateManifestID {
	case 816:
		req.NotesToOwner = "There was an error updating your Ocean to version 2.2 (1/3)"
	case 817, 818, 819:
		req.NotesToOwner = "There was an error updating your Ocean to version 2.2 (2/3)"
	case 820:
		req.NotesToOwner = "There was an error updating your Ocean to version 2.2 (3/3)"
	}

	return req
}

func BuildOtaUpdateStatusCanceledRequest(vin string, updateManifestID int64, info string) FoaOtaUpdateStatusRequest {
	var req = FoaOtaUpdateStatusRequest{
		Vin:    vin,
		Status: "CANCELLED",
		AddlData: FoaAddlData{
			CancelReason:  info,
			DateScheduled: time.Now().Local().String(),
		},
	}

	switch updateManifestID {
	case 816:
		req.NotesToOwner = "Update 2.2 (1/3) to your Ocean was canceled"
	case 817, 818, 819:
		req.NotesToOwner = "Update 2.2 (2/3) to your Ocean was canceled"
	case 820:
		req.NotesToOwner = "Update 2.2 (3/3) to your Ocean was canceled"
	}

	return req
}
