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

#include "ios/chrome/common/app_group/app_group_metrics_client.h"

#include "base/logging.h"
#include "base/mac/scoped_nsobject.h"
#include "ios/chrome/common/app_group/app_group_constants.h"
#include "ios/chrome/common/app_group/app_group_metrics.h"

#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif

namespace {

// Number of log files to keep in the |kPendingLogFileDirectory|. Any older file
// may be deleted.
const int kMaxFileNumber = 100;

}  // namespace

namespace app_group {
namespace client_app {

void AddPendingLog(NSData* log, AppGroupApplications application) {
  NSFileManager* file_manager = [NSFileManager defaultManager];
  NSURL* store_url = [file_manager
      containerURLForSecurityApplicationGroupIdentifier:ApplicationGroup()];

  NSURL* log_dir_url =
      [store_url URLByAppendingPathComponent:app_group::kPendingLogFileDirectory
                                 isDirectory:YES];
  [file_manager createDirectoryAtURL:log_dir_url
         withIntermediateDirectories:YES
                          attributes:nil
                               error:nil];

  // File name are formated using creationtimestamp_extensionname_PendingLog
  // (e.g: 123456789_TodayExtension_PendingLog).
  NSString* file_name = [NSString
      stringWithFormat:@"%ld_%@%@",
                       static_cast<long>([[NSDate date] timeIntervalSince1970]),
                       ApplicationName(application),
                       app_group::kPendingLogFileSuffix];
  NSURL* ready_log_url =
      [log_dir_url URLByAppendingPathComponent:file_name isDirectory:NO];

  [file_manager createFileAtPath:[ready_log_url path]
                        contents:log
                      attributes:nil];
}

void CleanOldPendingLogs() {
  NSFileManager* file_manager = [NSFileManager defaultManager];
  NSURL* store_url = [file_manager
      containerURLForSecurityApplicationGroupIdentifier:ApplicationGroup()];
  NSURL* log_dir_url =
      [store_url URLByAppendingPathComponent:app_group::kPendingLogFileDirectory
                                 isDirectory:YES];

  NSArray* pending_logs =
      [file_manager contentsOfDirectoryAtPath:[log_dir_url path] error:nil];

  if (kMaxFileNumber >= [pending_logs count])
    return;
  // sort by creation date
  NSMutableArray* files_and_properties =
      [NSMutableArray arrayWithCapacity:[pending_logs count]];
  for (NSString* file : pending_logs) {
    if (![file hasSuffix:app_group::kPendingLogFileSuffix])
      continue;
    NSURL* file_url =
        [log_dir_url URLByAppendingPathComponent:file isDirectory:NO];

    NSDictionary* properties =
        [file_manager attributesOfItemAtPath:[file_url path] error:nil];
    NSDate* mod_date = [properties objectForKey:NSFileModificationDate];

    [files_and_properties addObject:@{
      @"path" : file,
      @"lastModDate" : mod_date
    }];
  }

  // Sort files by modification date. Older files will be first.
  NSArray* sorted_files =
      [files_and_properties sortedArrayUsingComparator:^(id path1, id path2) {
        return [[path1 objectForKey:@"lastModDate"]
            compare:[path2 objectForKey:@"lastModDate"]];
      }];
  if (kMaxFileNumber >= [sorted_files count])
    return;
  NSUInteger first_file_to_keep = [sorted_files count] - kMaxFileNumber;
  for (NSUInteger file_index = 0; file_index < first_file_to_keep;
       file_index++) {
    NSString* path =
        [[sorted_files objectAtIndex:file_index] objectForKey:@"path"];
    NSURL* file_url =
        [log_dir_url URLByAppendingPathComponent:path isDirectory:NO];
    [file_manager removeItemAtURL:file_url error:nil];
  }
}

}  // namespace client_app
}  // namespace app_group
