package model

import (
	"io"
	"net/http"
	"strings"
	"time"
)

func (step *GenerationStep) BuildHTTPRequestResult(
	req *http.Request,
	resp *http.Response,
	dur time.Duration,
) (*ScenarioResultRecord, error) {
	expectSpec, err := step.ParseHTTPResponseExpect()
	if err != nil {
		return nil, err
	}
	isExpected, err := expectSpec.IsExpected(resp)
	if err != nil {
		return nil, err
	}

	result := new(ScenarioResultRecord)
	traceID := resp.Header.Get("x-debug-trace-id")
	service, _, _ := strings.Cut(step.OperationID, "_")
	// result.SwaggerCommitID = tc.SpecCommitID
	result.CaseID = step.CaseID
	result.Expected = isExpected
	result.DurationMilliSeconds = dur.Milliseconds()
	result.XDebugTraceID = traceID
	result.GenerationID = step.GenerationID
	result.Service = service
	result.Meta = step.Meta
	result.Stage = step.Stage
	result.Order = step.Order
	result.StepType = step.StepType
	result.RequestType = step.RequestType
	result.MaxRetries = step.MaxRetries
	result.DelayAfter = step.DelayAfter
	{
		if rseeker, ok := resp.Body.(io.ReadSeeker); ok {
			_, _ = rseeker.Seek(0, 0)
		}
		bs, err := io.ReadAll(resp.Body)
		if err != nil {
			return nil, err
		}
		result.Result = string(bs)
	}
	{
		if rseeker, ok := req.Body.(io.ReadSeeker); ok {
			_, _ = rseeker.Seek(0, 0)
		}
		bs, err := io.ReadAll(req.Body)
		if err != nil {
			return nil, err
		}
		result.Request = string(bs)
	}
	return result, nil
}

func (step *GenerationStep) BuildCommandResult(
	existCode int,
	output []byte,
	dur time.Duration,
) (*ScenarioResultRecord, error) {
	expectSpec, err := step.ParseCommandExpect()
	if err != nil {
		return nil, err
	}
	isExpected, err := expectSpec.IsExpected(existCode, output)
	if err != nil {
		return nil, err
	}
	result := new(ScenarioResultRecord)
	service, _, _ := strings.Cut(step.OperationID, "_")
	// result.SwaggerCommitID = tc.SpecCommitID
	result.CaseID = step.CaseID
	result.Expected = isExpected
	result.DurationMilliSeconds = dur.Milliseconds()
	result.GenerationID = step.GenerationID
	result.Service = service
	result.Meta = step.Meta
	result.Stage = step.Stage
	result.Order = step.Order
	result.StepType = step.StepType
	result.RequestType = step.RequestType
	result.MaxRetries = step.MaxRetries
	result.DelayAfter = step.DelayAfter
	if step.Request != nil {
		result.Request = *step.Request
	}
	result.Result = string(output)
	return result, nil
}
