// Generated by Create API
// https://github.com/CreateAPI/CreateAPI

import Foundation
import Get
import URLQueryEncoder

extension Paths.Auth {
    public var createVisitor: CreateVisitor {
        CreateVisitor(path: path + "/create-visitor")
    }

    public struct CreateVisitor {
        /// Path: `/api/auth/create-visitor`
        public let path: String

        /// Create Visitor
        public func post(_ body: GenAPI.CreateVisitorRequest) -> Request<PostResponse> {
            Request(path: path, method: "POST", body: body, id: "studio_api_auth_api_create_visitor")
        }

        /// Response
        public struct PostResponse: Decodable, Equatable {
            /// Response
            public var object: Object?
            public var anyJSON: AnyJSON?

            /// Response
            public enum Object: Decodable, Equatable {
                case createVisitorTokenGrantResponse(GenAPI.CreateVisitorTokenGrantResponse)
                case createVisitorRequireSignupResponse(GenAPI.CreateVisitorRequireSignupResponse)
                case createVisitorAlreadyLoggedInResponse(GenAPI.CreateVisitorAlreadyLoggedInResponse)

                public init(from decoder: Decoder) throws {

                    struct Discriminator: Decodable {
                        let type: String
                    }

                    let container = try decoder.singleValueContainer()
                    let discriminatorValue = try container.decode(Discriminator.self).type

                    switch discriminatorValue {
                    case "token_grant": self = .createVisitorTokenGrantResponse(try container.decode(GenAPI.CreateVisitorTokenGrantResponse.self))
                    case "require_signup": self = .createVisitorRequireSignupResponse(try container.decode(GenAPI.CreateVisitorRequireSignupResponse.self))
                    case "already_logged_in": self = .createVisitorAlreadyLoggedInResponse(try container.decode(GenAPI.CreateVisitorAlreadyLoggedInResponse.self))

                    default:
                        throw DecodingError.dataCorruptedError(
                            in: container,
                            debugDescription: "Discriminator value '\(discriminatorValue)' does not match any expected values (token_grant, require_signup, already_logged_in)."
                        )
                    }
                }
            }

            public init(object: Object? = nil, anyJSON: AnyJSON? = nil) {
                self.object = object
                self.anyJSON = anyJSON
            }

            public init(from decoder: Decoder) throws {
                let container = try decoder.singleValueContainer()
                self.object = try? container.decode(Object.self)
                self.anyJSON = try? container.decode(AnyJSON.self)
            }
        }
    }
}
