@isTest
global with sharing class MockClient extends ClientFactory {
  global override void delay(
    Integer delayInMilliSeconds,
    List<String> requestIds
  ) {
  }
  global override List<Attachment> createAttachments(
    List<Types.CreateAttachmentInput> attachmentInputs,
    String library,
    String runAs
  ) {
    List<Attachment> atts = new List<Attachment>();
    for (Integer i = 0; i < attachmentInputs.size(); i++) {
      Types.CreateAttachmentInput input = attachmentInputs[i];
      Attachment att = new Attachment();
      att.id = 'testid-' + String.valueOf(i);
      att.resource = new Resource(
        'testid-' + String.valueOf(i),
        input.resourceType,
        'test-resource-' + String.valueOf(i),
        library,
        input.driveId
      );
      atts.add(att);
    }
    return atts;
  }
  global override List<Attachment> shareResources(
    List<Types.ShareResourceInput> shareResourceInputs,
    String library,
    String runAs
  ) {
    List<Attachment> atts = new List<Attachment>();
    for (Integer i = 0; i < shareResourceInputs.size(); i++) {
      Types.ShareResourceInput input = shareResourceInputs[i];
      Attachment att = new Attachment();
      att.id = 'testid-' + String.valueOf(i);
      att.resource = new Resource(
        input.resourceId,
        input.resourceType,
        'test-resource-' + String.valueOf(i),
        library,
        input.driveId
      );
      atts.add(att);
    }
    return atts;
  }
  global override void deleteAttachments(
    List<Types.DeleteAttachmentInput> attachmentInputs,
    String library,
    String runAs
  ) {
  }
  global override void unshareResources(
    List<Types.UnshareResourceInput> unshareResourceInputs,
    String library,
    String runAs
  ) {
  }
  global override List<UpdateLicensesFlowOutput> assignUserLicenses(
    List<Types.UpdateLicensesInput> inputs,
    String runAs
  ) {
    List<UpdateLicensesFlowOutput> outs = new List<UpdateLicensesFlowOutput>();
    for (Integer i = 0; i < inputs.size(); i++) {
      UpdateLicensesFlowOutput out = new UpdateLicensesFlowOutput();
      out.totalLicenses = 100;
      out.remainingLicenses = 100 - (i + 1);
      outs.add(out);
    }
    return outs;
  }
  global override List<UpdateLicensesFlowOutput> unassignUserLicenses(
    List<Types.UpdateLicensesInput> inputs,
    String runAs
  ) {
    List<UpdateLicensesFlowOutput> outs = new List<UpdateLicensesFlowOutput>();
    for (Integer i = 0; i < inputs.size(); i++) {
      UpdateLicensesFlowOutput out = new UpdateLicensesFlowOutput();
      out.totalLicenses = 100;
      out.remainingLicenses = 100;
      outs.add(out);
    }
    return outs;
  }
  global override void updateLinksSettings(
    List<Types.UpdateLinkSettingsInput> inputs,
    String runAs
  ) {
  }
  global override List<Resource> createFolders(
    List<Types.CreateFolderInput> inputs,
    String libraryId,
    String runAs
  ) {
    List<Resource> resources = new List<Resource>();
    for (Integer i = 0; i < inputs.size(); i++) {
      Types.CreateFolderInput input = inputs[i];
      Resource createdFolder = new Resource(
        'testid-' + String.valueOf(i),
        'folder',
        'testfolder-' + String.valueOf(i),
        libraryId,
        input.driveId
      );
      resources.add(createdFolder);
    }
    return resources;
  }
  global override List<String> createMicrosoftTeam(
    List<Types.CreateMicrosoftTeamInput> inputs,
    String runAs
  ) {
    List<String> toReturn = new List<String>();
    for (Integer i = 0; i < inputs.size(); i++) {
      toReturn.add('testid-' + String.valueOf(i));
    }
    return toReturn;
  }
  global override List<SharePointSite> createSharePointSite(
    List<Types.CreateSharePointSiteInput> inputs,
    String runAs
  ) {
    List<SharePointSite> toReturn = new List<SharePointSite>();
    for (Integer i = 0; i < inputs.size(); i++) {
      SharePointSite site = new SharePointSite();
      site.id = 'test-siteid-' + String.valueOf(i);
      site.name = inputs[i].name;
      site.url = inputs[i].url;
      site.driveId = 'test-primarydriveid-' + String.valueOf(i);
      toReturn.add(site);
    }
    return toReturn;
  }
  global override List<Drive> createDrive(
    List<Types.CreateDriveInput> inputs,
    String runAs
  ) {
    List<Drive> drives = new List<Drive>();
    for (Integer i = 0; i < inputs.size(); i++) {
      Drive d = new Drive();
      d.id = 'testid-' + String.valueOf(i);
      drives.add(d);
    }
    return drives;
  }
  global override void createFoldersAsync(
    List<Types.CreateFolderInput> inputs,
    String libraryId,
    String runAs
  ) {
  }
  global override List<Link> createLinks(
    List<Types.CreateLinkInput> linkInputs,
    String library,
    String runAs
  ) {
    List<Link> links = new List<Link>();
    for (Integer i = 0; i < linkInputs.size(); i++) {
      Link l = new Link();
      l.id = 'testid-' + String.valueOf(i);
      l.url = 'http://test.url/' + String.valueOf(i);
      links.add(l);
    }
    return links;
  }
  global override List<ResourceList> getFolderContents(
    List<Resource> folders,
    String sortBy,
    String sortOrder,
    String runAs,
    String contentType
  ) {
    List<ResourceList> lists = new List<ResourceList>();
    for (Integer i = 0; i < folders.size(); i++) {
      ResourceList rl = new ResourceList();
      lists.add(rl);
    }
    return lists;
  }
  global override List<Dataroom> createDatarooms(
    List<Types.CreateDataroomInput> dataroomInputs,
    String runAs
  ) {
    List<Dataroom> datarooms = new List<Dataroom>();
    for (Integer i = 0; i < dataroomInputs.size(); i++) {
      Dataroom d = new Dataroom();
      d.id = 'testid-' + String.valueOf(i);
      datarooms.add(d);
    }
    return datarooms;
  }
  global override void addToDataroom(
    List<Types.AddDataroomChildrenInput> childrenInputs,
    String runAs
  ) {
  }
  global override List<GeneratedDocument> generateDocumentSync(
    List<Types.DocGenRequestInput> payloads,
    String runAs
  ) {
    List<GeneratedDocument> docs = new List<GeneratedDocument>();
    for (Integer i = 0; i < payloads.size(); i++) {
      GeneratedDocument doc = new GeneratedDocument(
        'test-name-' + String.valueOf(i),
        'download-url-' + String.valueOf(i),
        'test-content-version-id-' + String.valueOf(i)
      );
      doc.file = new Resource(
        'doc-resource-id' + String.valueOf(i),
        'file',
        doc.name,
        'library',
        payloads[i].destination.driveId
      );
      docs.add(doc);
    }
    return docs;
  }
  global override void generateDocument(
    List<Types.DocGenRequestInput> payloads,
    String runAs
  ) {
  }
  global override List<FileRequest> createFileRequests(
    List<Types.CreateFileRequestInput> fileRequestInputs,
    String runAs
  ) {
    List<FileRequest> frs = new List<FileRequest>();
    for (Integer i = 0; i < fileRequestInputs.size(); i++) {
      FileRequest fr = new FileRequest();
      fr.id = 'testid-' + String.valueOf(i);
      frs.add(fr);
    }
    return frs;
  }
  global override void copyResources(
    List<Types.CopyResourceInput> inputs,
    String library,
    String driveId,
    String runAs
  ) {
  }
  global override List<List<Attachment>> listAttachments(
    List<String> parentIds,
    String runAs
  ) {
    List<List<Attachment>> result = new List<List<Attachment>>();
    for (Integer i = 0; i < parentIds.size(); i++) {
      List<Attachment> attList = new List<Attachment>();
      Attachment file = new Attachment();
      file.id = 'testid-' + String.valueOf(i);
      file.resource = new Resource(
        'testid-' + String.valueOf(i),
        'file',
        'name-' + String.valueOf(i),
        'library',
        'driveId-' + String.valueOf(i)
      );
      Attachment folderAttachment = new Attachment();
      folderAttachment.id = 'testfolderid-' + String.valueOf(i);
      folderAttachment.resource = new Resource(
        'testfolderid-' + String.valueOf(i),
        'folder',
        'foldername-' + String.valueOf(i),
        'library',
        'driveId-' + String.valueOf(i)
      );
      attList.add(file);
      attList.add(folderAttachment);
      result.add(attList);
    }
    return result;
  }
  global override void moveResources(
    List<Types.MoveResourceInput> inputs,
    String library,
    String runAs
  ) {
  }
  global override void updatePermissions(
    List<Types.PermissionInput> permissionInputs,
    String library,
    String runAs
  ) {
  }
  global override List<String> getPreviewUrls(
    List<Resource> resources,
    PreviewParams params,
    String library,
    String runAs
  ) {
    List<String> urls = new List<String>();
    for (Integer i = 0; i < resources.size(); i++) {
      urls.add('https:/test.cloudfiles.io/' + String.valueOf(i)); //Check with Ankit on how preview urls look
    }
    return urls;
  }
  global override void deleteResources(
    List<Types.DeleteResourcesInput> resourcesInput,
    String library,
    String runAs
  ) {
  }
  global override void updateResources(
    List<Types.UpdateResourceInput> inputs,
    String library,
    String runAs
  ) {
  }
  global override List<ResourceList> searchByProperty(
    List<Types.SearchByPropertyInput> inputs,
    String library,
    String runAs
  ) {
    List<ResourceList> lists = new List<ResourceList>();
    for (Integer i = 0; i < inputs.size(); i++) {
      Types.SearchByPropertyInput input = inputs[i];
      Resource resource = new Resource(
        'searchedid-' + String.valueOf(i),
        'file',
        'searched-value',
        library,
        input.driveId
      );
      ResourceList rl = new ResourceList();
      rl.resources = new List<Resource>{ resource };
      lists.add(rl);
    }
    return lists;
  }
  global override void upload(
    List<Types.UploadSalesforceFilePayload> files,
    String runAs
  ) {
  }
  global override void createContentVersion(
    List<Types.CreateContentVersionPayload> files,
    String runAs
  ) {
  }
  global override void createContentVersionBatch(
    List<Types.CreateContentVersionBatchPayload> inputs,
    String runAs
  ) {
  }
  global override void processDocument(
    List<Types.ProcessDocumentPayload> payloads,
    String runAs
  ) {
  }
  global override void splitDocument(
    List<Types.SplitDocumentPayload> payloads,
    String runAs
  ) {
  }
  global override List<String> queryDocument(
    List<Types.QueryDocumentPayload> payloads,
    String runAs
  ) {
    List<String> responses = new List<String>();
    for (Integer i = 0; i < payloads.size(); i++) {
      responses.add('ai-response-' + String.valueOf(i));
    }
    return responses;
  }
  global override List<GeneratedDocument> mergeDocumentsSync(
    List<Types.MergeDocumentsRequestInput> payloads,
    String runAs
  ) {
    List<GeneratedDocument> docs = new List<GeneratedDocument>();
    for (Integer i = 0; i < payloads.size(); i++) {
      Types.MergeDocumentsRequestInput input = payloads[i];
      // Simulate a merged document with a file resource
      Resource file = new Resource(
        'merged-file-id-' + String.valueOf(i),
        'file',
        input.fileName != null
          ? input.fileName
          : 'merged-file-' + String.valueOf(i),
        'library',
        'driveId-' + String.valueOf(i)
      );
      GeneratedDocument doc = new GeneratedDocument(
        input.fileName != null
          ? input.fileName
          : 'merged-file-' + String.valueOf(i),
        'http://download.url/' + String.valueOf(i),
        file
      );
      doc.contentVersionId = 'contentVersionId-' + String.valueOf(i);
      doc.previewUrl = 'http://preview.url/' + String.valueOf(i);
      docs.add(doc);
    }
    return docs;
  }
}