// dto.go defines the HTTP request/response shapes for the change-request module.
package changerequest

import (
	"time"

	"github.com/google/uuid"
)

// ===== request DTO =====

type createReq struct {
	SourceBranch  string     `json:"source_branch"`
	TargetBranch  string     `json:"target_branch"`
	Title         string     `json:"title"`
	Description   string     `json:"description"`
	RequirementID *uuid.UUID `json:"requirement_id"`
	IssueID       *uuid.UUID `json:"issue_id"`
}

type reviewReq struct {
	Verdict string `json:"verdict"`
	Note    string `json:"note"`
}

type mergeReq struct {
	Method string `json:"method"`
}

// ===== response DTO =====

type changeRequestResp struct {
	ID             uuid.UUID  `json:"id"`
	ProjectID      uuid.UUID  `json:"project_id"`
	WorkspaceID    uuid.UUID  `json:"workspace_id"`
	RequirementID  *uuid.UUID `json:"requirement_id"`
	IssueID        *uuid.UUID `json:"issue_id"`
	Number         int        `json:"number"`
	Title          string     `json:"title"`
	Description    string     `json:"description"`
	SourceBranch   string     `json:"source_branch"`
	TargetBranch   string     `json:"target_branch"`
	State          string     `json:"state"`
	ReviewVerdict  string     `json:"review_verdict"`
	CIState        string     `json:"ci_state"`
	Provider       string     `json:"provider"`
	ExternalID     *int64     `json:"external_id"`
	ExternalURL    string     `json:"external_url"`
	MergeCommitSHA string     `json:"merge_commit_sha"`
	ReviewedBy     *uuid.UUID `json:"reviewed_by"`
	ReviewedAt     *time.Time `json:"reviewed_at"`
	CreatedBy      uuid.UUID  `json:"created_by"`
	MergedAt       *time.Time `json:"merged_at"`
	CreatedAt      time.Time  `json:"created_at"`
	UpdatedAt      time.Time  `json:"updated_at"`
}

func toResp(cr *ChangeRequest) changeRequestResp {
	return changeRequestResp{
		ID: cr.ID, ProjectID: cr.ProjectID, WorkspaceID: cr.WorkspaceID,
		RequirementID: cr.RequirementID, IssueID: cr.IssueID, Number: cr.Number,
		Title: cr.Title, Description: cr.Description,
		SourceBranch: cr.SourceBranch, TargetBranch: cr.TargetBranch,
		State: string(cr.State), ReviewVerdict: string(cr.ReviewVerdict),
		CIState: string(cr.CIState), Provider: cr.Provider,
		ExternalID: cr.ExternalID, ExternalURL: cr.ExternalURL, MergeCommitSHA: cr.MergeCommitSHA,
		ReviewedBy: cr.ReviewedBy, ReviewedAt: cr.ReviewedAt, CreatedBy: cr.CreatedBy,
		MergedAt: cr.MergedAt, CreatedAt: cr.CreatedAt, UpdatedAt: cr.UpdatedAt,
	}
}
