// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package http3

import "sync"

type tableEntry struct {
	name  string
	value string
}

// staticTableEntry returns the static table entry with the given index.
func staticTableEntry(index int64) (tableEntry, error) {
	if index < 0 || index >= int64(len(staticTableEntries)) {
		return tableEntry{}, errQPACKDecompressionFailed
	}
	return staticTableEntries[index], nil
}

func initStaticTableMaps() {
	staticTableByName = make(map[string]int)
	staticTableByNameValue = make(map[tableEntry]int)
	for i, ent := range staticTableEntries {
		if _, ok := staticTableByName[ent.name]; !ok {
			staticTableByName[ent.name] = i
		}
		staticTableByNameValue[ent] = i
	}
}

var (
	staticTableOnce        sync.Once
	staticTableByName      map[string]int
	staticTableByNameValue map[tableEntry]int
)

// https://www.rfc-editor.org/rfc/rfc9204.html#appendix-A
//
// Note that this is different from the HTTP/2 static table.
var staticTableEntries = [...]tableEntry{
	0:  {":authority", ""},
	1:  {":path", "/"},
	2:  {"age", "0"},
	3:  {"content-disposition", ""},
	4:  {"content-length", "0"},
	5:  {"cookie", ""},
	6:  {"date", ""},
	7:  {"etag", ""},
	8:  {"if-modified-since", ""},
	9:  {"if-none-match", ""},
	10: {"last-modified", ""},
	11: {"link", ""},
	12: {"location", ""},
	13: {"referer", ""},
	14: {"set-cookie", ""},
	15: {":method", "CONNECT"},
	16: {":method", "DELETE"},
	17: {":method", "GET"},
	18: {":method", "HEAD"},
	19: {":method", "OPTIONS"},
	20: {":method", "POST"},
	21: {":method", "PUT"},
	22: {":scheme", "http"},
	23: {":scheme", "https"},
	24: {":status", "103"},
	25: {":status", "200"},
	26: {":status", "304"},
	27: {":status", "404"},
	28: {":status", "503"},
	29: {"accept", "*/*"},
	30: {"accept", "application/dns-message"},
	31: {"accept-encoding", "gzip, deflate, br"},
	32: {"accept-ranges", "bytes"},
	33: {"access-control-allow-headers", "cache-control"},
	34: {"access-control-allow-headers", "content-type"},
	35: {"access-control-allow-origin", "*"},
	36: {"cache-control", "max-age=0"},
	37: {"cache-control", "max-age=2592000"},
	38: {"cache-control", "max-age=604800"},
	39: {"cache-control", "no-cache"},
	40: {"cache-control", "no-store"},
	41: {"cache-control", "public, max-age=31536000"},
	42: {"content-encoding", "br"},
	43: {"content-encoding", "gzip"},
	44: {"content-type", "application/dns-message"},
	45: {"content-type", "application/javascript"},
	46: {"content-type", "application/json"},
	47: {"content-type", "application/x-www-form-urlencoded"},
	48: {"content-type", "image/gif"},
	49: {"content-type", "image/jpeg"},
	50: {"content-type", "image/png"},
	51: {"content-type", "text/css"},
	52: {"content-type", "text/html; charset=utf-8"},
	53: {"content-type", "text/plain"},
	54: {"content-type", "text/plain;charset=utf-8"},
	55: {"range", "bytes=0-"},
	56: {"strict-transport-security", "max-age=31536000"},
	57: {"strict-transport-security", "max-age=31536000; includesubdomains"},
	58: {"strict-transport-security", "max-age=31536000; includesubdomains; preload"},
	59: {"vary", "accept-encoding"},
	60: {"vary", "origin"},
	61: {"x-content-type-options", "nosniff"},
	62: {"x-xss-protection", "1; mode=block"},
	63: {":status", "100"},
	64: {":status", "204"},
	65: {":status", "206"},
	66: {":status", "302"},
	67: {":status", "400"},
	68: {":status", "403"},
	69: {":status", "421"},
	70: {":status", "425"},
	71: {":status", "500"},
	72: {"accept-language", ""},
	73: {"access-control-allow-credentials", "FALSE"},
	74: {"access-control-allow-credentials", "TRUE"},
	75: {"access-control-allow-headers", "*"},
	76: {"access-control-allow-methods", "get"},
	77: {"access-control-allow-methods", "get, post, options"},
	78: {"access-control-allow-methods", "options"},
	79: {"access-control-expose-headers", "content-length"},
	80: {"access-control-request-headers", "content-type"},
	81: {"access-control-request-method", "get"},
	82: {"access-control-request-method", "post"},
	83: {"alt-svc", "clear"},
	84: {"authorization", ""},
	85: {"content-security-policy", "script-src 'none'; object-src 'none'; base-uri 'none'"},
	86: {"early-data", "1"},
	87: {"expect-ct", ""},
	88: {"forwarded", ""},
	89: {"if-range", ""},
	90: {"origin", ""},
	91: {"purpose", "prefetch"},
	92: {"server", ""},
	93: {"timing-allow-origin", "*"},
	94: {"upgrade-insecure-requests", "1"},
	95: {"user-agent", ""},
	96: {"x-forwarded-for", ""},
	97: {"x-frame-options", "deny"},
	98: {"x-frame-options", "sameorigin"},
}
