package request

type ComplaintCreateAttributes struct {
	// HelicopterID — the helicopter this complaint is filed against. REQUIRED.
	HelicopterID string `json:"helicopter_id" validate:"required,uuid" example:"019d6771-5fb5-7337-837f-bc5ed85181a1"`
	// FlightID — the flight/report this complaint was filed in (attribution). OPTIONAL;
	// open-defect tracking stays per-helicopter so defects carry forward across flights.
	FlightID string `json:"flight_id,omitempty" validate:"omitempty,uuid" example:"019d6774-98e8-7fba-9ef4-3795c0da8a13"`
	// Description — the defect description. REQUIRED.
	Description string `json:"description" validate:"required" example:"Engine 2 N2 vibration intermittent during cruise above 110 KIAS"`
	// MELSeverity — MEL (Minimum Equipment List) classification. OPTIONAL at creation:
	// omit it to file the complaint as "pending_mel" and classify later. It MUST be
	// classified (via update) before recording action taken. A pending complaint does
	// NOT ground the aircraft — grounding starts at classification. Values: 0 = NON-MEL
	// (grounds immediately), 1 = A (grace 1 day), 2 = B (3 days), 3 = C (10 days), 4 = D (120 days).
	MELSeverity *int8 `json:"mel_severity,omitempty" validate:"omitempty,oneof=0 1 2 3 4" enums:"0,1,2,3,4" example:"2"`
	// AircraftHoursAtReport — OPTIONAL airframe hours recorded when the defect was reported.
	AircraftHoursAtReport *string `json:"aircraft_hours_at_report,omitempty" example:"1245.3"`
	// NSR is no longer set here — it is its own flow: POST /complaints/nsr/sign/{id}.
}

type ComplaintCreateData struct {
	Type       string                    `json:"type" validate:"required,oneof=complaint_create complaint" example:"complaint_create"`
	Attributes ComplaintCreateAttributes `json:"attributes" validate:"required"`
}

type ComplaintCreateRequest struct {
	Data ComplaintCreateData `json:"data" validate:"required"`
}

type ComplaintUpdateAttributes struct {
	// Description — defect description.
	Description *string `json:"description,omitempty" example:"Engine 2 vibration confirmed"`
	// MELSeverity — MEL classification. 0 = NON-MEL (immediate AOG), 1 = A (1 day),
	// 2 = B (3 days), 3 = C (10 days), 4 = D (120 days). AOG after grace passes.
	MELSeverity *int8 `json:"mel_severity,omitempty" validate:"omitempty,oneof=0 1 2 3 4" enums:"0,1,2,3,4" example:"2"`
	// AircraftHoursAtReport — airframe hours at report time.
	AircraftHoursAtReport *string `json:"aircraft_hours_at_report,omitempty" example:"1245.3"`
	// NSR is no longer set here — it is its own flow: POST /complaints/nsr/sign/{id}.
}

// ComplaintNSRSignAttributes carries the (optional) justification for a Non-Safety
// Release decision. NSR is signed via its own endpoint, separate from complaint update.
type ComplaintNSRSignAttributes struct {
	// NSRReason — OPTIONAL free-text justification for the NSR (MEL deferral) decision.
	NSRReason *string `json:"nsr_reason,omitempty" example:"Released under MEL A, defect deferred"`
}

type ComplaintNSRSignData struct {
	Type       string                     `json:"type" validate:"omitempty,oneof=complaint_nsr_sign complaint_nsr" example:"complaint_nsr_sign"`
	Attributes ComplaintNSRSignAttributes `json:"attributes"`
}

type ComplaintNSRSignRequest struct {
	Data ComplaintNSRSignData `json:"data"`
}

type ComplaintUpdateData struct {
	Type       string                    `json:"type" validate:"required,oneof=complaint_update complaint" example:"complaint_update"`
	ID         string                    `json:"id" validate:"required" example:"019d6771-5fb5-7337-837f-bc5ed85181a1"`
	Attributes ComplaintUpdateAttributes `json:"attributes" validate:"required"`
}

type ComplaintUpdateRequest struct {
	Data ComplaintUpdateData `json:"data" validate:"required"`
}

type ComplaintActionTakenAttributes struct {
	// ActionTaken — corrective action text. Required when recording (create); on update an
	// empty value clears it (allowed only while the action has not been signed off).
	ActionTaken        string  `json:"action_taken" example:"Tightened engine mount and rechecked torque"`
	AircraftHoursAtFix *string `json:"aircraft_hours_at_fix,omitempty" example:"1250.1"`
}

type ComplaintActionTakenData struct {
	Type       string                         `json:"type" validate:"required,oneof=complaint_action_taken complaint" example:"complaint_action_taken"`
	Attributes ComplaintActionTakenAttributes `json:"attributes" validate:"required"`
}

type ComplaintActionTakenRequest struct {
	Data ComplaintActionTakenData `json:"data" validate:"required"`
}
