/*
 * Copyright (c) 2016 Schibsted Products & Technology AS. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
 */

package com.schibsted.security.strongbox.sdk.internal.config.credentials;

import com.amazonaws.auth.BasicSessionCredentials;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

/**
 * Used for serialization and deserialization of session caches located in ~/.aws/cli/cache/
 *
 * @author stiankri
 */
@JsonIgnoreProperties(ignoreUnknown = true)
public class SessionCacheSchema {
    @JsonProperty("AssumedRoleUser")
    public final AssumedUserRole assumedUserRole;

    @JsonProperty("Credentials")
    public final Credentials credentials;

    public SessionCacheSchema(final String arn,
                              final String assumedRoleId,
                              final BasicSessionCredentials credentials,
                              final ZonedDateTime expiration) {
        this.assumedUserRole = new AssumedUserRole(arn, assumedRoleId);
        this.credentials = new Credentials(credentials, expiration);
    }

    public SessionCacheSchema(@JsonProperty("AssumedRoleUser") final AssumedUserRole assumedUserRole,
                              @JsonProperty("Credentials") final Credentials credentials) {
        this.assumedUserRole = assumedUserRole;
        this.credentials = credentials;
    }

    public static class AssumedUserRole {
        @JsonProperty("Arn")
        public final String arn;

        @JsonProperty("AssumedRoleId")
        public final String assumedRoleId;

        public AssumedUserRole(@JsonProperty("Arn") final String arn,
                               @JsonProperty("AssumedRoleId") final String assumedRoleId) {
            this.arn = arn;
            this.assumedRoleId = assumedRoleId;
        }
    }

    public static class Credentials {
        @JsonProperty("AccessKeyId")
        public final String accessKeyId;

        @JsonProperty("Expiration")
        public final  String expiration;

        @JsonProperty("SecretAccessKey")
        public final String secretAccessKey;

        @JsonProperty("SessionToken")
        public final String sessionToken;

        public Credentials(@JsonProperty("AccessKeyId") final String accessKeyId,
                           @JsonProperty("Expiration") final String expiration,
                           @JsonProperty("SecretAccessKey") final String secretAccessKey,
                           @JsonProperty("SessionToken") final String sessionToken) {
            this.accessKeyId = accessKeyId;
            this.expiration = expiration;
            this.secretAccessKey = secretAccessKey;
            this.sessionToken = sessionToken;
        }

        public Credentials(final BasicSessionCredentials credentials,
                           final ZonedDateTime expiration) {
            this.accessKeyId = credentials.getAWSAccessKeyId();
            this.secretAccessKey = credentials.getAWSSecretKey();
            this.sessionToken = credentials.getSessionToken();
            this.expiration = expiration.format(DateTimeFormatter.ISO_INSTANT);
        }

        ZonedDateTime getExpiration() {
            return ZonedDateTime.parse(this.expiration, DateTimeFormatter.ISO_DATE_TIME);
        }
    }
}