package acltest

import (
	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/acl"
	apetest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/ape/test"
	accountingtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/refs/test"
)

func GenerateBearerToken(empty bool) *acl.BearerToken {
	m := new(acl.BearerToken)

	if !empty {
		m.SetBody(GenerateBearerTokenBody(false))
	}

	m.SetSignature(accountingtest.GenerateSignature(empty))

	return m
}

func GenerateBearerTokenBody(empty bool) *acl.BearerTokenBody {
	m := new(acl.BearerTokenBody)

	if !empty {
		m.SetOwnerID(accountingtest.GenerateOwnerID(false))
		m.SetLifetime(GenerateTokenLifetime(false))
		m.SetAPEOverride(GenerateAPEOverride(empty))
	}

	return m
}

func GenerateAPEOverride(empty bool) *acl.APEOverride {
	var m *acl.APEOverride

	if !empty {
		m = new(acl.APEOverride)
		m.SetTarget(apetest.GenerateChainTarget(empty))
		m.SetChains(apetest.GenerateRawChains(false, 3))
	}

	return m
}

func GenerateTable(empty bool) *acl.Table {
	m := new(acl.Table)

	if !empty {
		m.SetRecords(GenerateRecords(false))
		m.SetContainerID(accountingtest.GenerateContainerID(false))
	}

	m.SetVersion(accountingtest.GenerateVersion(empty))

	return m
}

func GenerateRecords(empty bool) []acl.Record {
	var rs []acl.Record

	if !empty {
		rs = append(rs,
			*GenerateRecord(false),
			*GenerateRecord(false),
		)
	}

	return rs
}

func GenerateRecord(empty bool) *acl.Record {
	m := new(acl.Record)

	if !empty {
		m.SetAction(acl.ActionAllow)
		m.SetOperation(acl.OperationGet)
		m.SetFilters(GenerateFilters(false))
		m.SetTargets(GenerateTargets(false))
	}

	return m
}

func GenerateFilters(empty bool) []acl.HeaderFilter {
	var fs []acl.HeaderFilter

	if !empty {
		fs = append(fs,
			*GenerateFilter(false),
			*GenerateFilter(false),
		)
	}

	return fs
}

func GenerateFilter(empty bool) *acl.HeaderFilter {
	m := new(acl.HeaderFilter)

	if !empty {
		m.SetKey("key")
		m.SetValue("val")
		m.SetHeaderType(acl.HeaderTypeRequest)
		m.SetMatchType(acl.MatchTypeStringEqual)
	}

	return m
}

func GenerateTargets(empty bool) []acl.Target {
	var ts []acl.Target

	if !empty {
		ts = append(ts,
			*GenerateTarget(false),
			*GenerateTarget(false),
		)
	}

	return ts
}

func GenerateTarget(empty bool) *acl.Target {
	m := new(acl.Target)

	if !empty {
		m.SetRole(acl.RoleSystem)
		m.SetKeys([][]byte{{1}, {2}})
	}

	return m
}

func GenerateTokenLifetime(empty bool) *acl.TokenLifetime {
	m := new(acl.TokenLifetime)

	if !empty {
		m.SetExp(1)
		m.SetIat(2)
		m.SetExp(3)
	}

	return m
}