<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.openfilz</groupId>
        <artifactId>openfilz-sdk</artifactId>
        <version>1.2.2</version>
    </parent>

    <artifactId>openfilz-sdk-csharp</artifactId>
    <packaging>pom</packaging>
    <name>OpenFilz C# SDK</name>
    <description>C# SDK for OpenFilz REST API</description>

    <dependencies>
        <!-- Reactor dependency for spec artifact ordering -->
        <dependency>
            <groupId>org.openfilz</groupId>
            <artifactId>openfilz-api</artifactId>
            <version>${project.version}</version>
            <type>json</type>
            <classifier>openapi</classifier>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- Copy OpenAPI spec from openfilz-api artifact -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>unpack-openapi-spec</id>
                        <phase>initialize</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>org.openfilz</groupId>
                                    <artifactId>openfilz-api</artifactId>
                                    <version>${project.version}</version>
                                    <type>json</type>
                                    <classifier>openapi</classifier>
                                    <outputDirectory>${project.build.directory}/openapi</outputDirectory>
                                    <destFileName>openfilz-api.json</destFileName>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <!-- Generate C# SDK from OpenAPI spec -->
            <plugin>
                <groupId>org.openapitools</groupId>
                <artifactId>openapi-generator-maven-plugin</artifactId>
                <version>${openapi-generator.version}</version>
                <executions>
                    <execution>
                        <id>generate-csharp-sdk</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <inputSpec>${openapi.spec.uri}</inputSpec>
                            <generatorName>csharp</generatorName>
                            <output>${project.build.directory}/generated-sdk/csharp</output>
                            <gitUserId>openfilz</gitUserId>
                            <gitRepoId>openfilz-core</gitRepoId>
                            <inlineSchemaNameMappings>
                                <inlineSchemaNameMapping>AuditLog_details=AuditLogDetailsOneOf</inlineSchemaNameMapping>
                            </inlineSchemaNameMappings>
                            <configOptions>
                                <legacyDiscriminatorBehavior>false</legacyDiscriminatorBehavior>
                                <packageName>OpenFilz.Sdk</packageName>
                                <packageVersion>${project.version}</packageVersion>
                                <targetFramework>net8.0</targetFramework>
                                <netCoreProjectFile>true</netCoreProjectFile>
                                <licenseName>AGPL-3.0</licenseName>
                                <licenseUrl>https://www.gnu.org/licenses/agpl-3.0.html</licenseUrl>
                            </configOptions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <!-- Copy GraphQL schemas into generated SDK directory -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-graphql-schemas</id>
                        <phase>process-sources</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/generated-sdk/csharp/graphql</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>${project.basedir}/../../openfilz-api/src/main/resources/graphql</directory>
                                    <includes>
                                        <include>**/*.graphqls</include>
                                    </includes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- Fix OpenAPI Generator C# bugs using maven-antrun-plugin (pure Java, cross-platform) -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <!-- Fix 1: List<Stream> passed to StreamContent() for multi-file upload -->
                    <execution>
                        <id>fix-csharp-multifile-upload</id>
                        <phase>process-sources</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <replaceregexp file="${project.build.directory}/generated-sdk/csharp/src/OpenFilz.Sdk/Api/DocumentControllerApi.cs" match="(upload-multiple[\s\S]{0,1500}?)multipartContentLocalVar\.Add\(new StreamContent\(file\)\);" replace="\1foreach (var fileItem in file) { multipartContentLocalVar.Add(new StreamContent(fileItem)); }" flags="s" />
                            </target>
                        </configuration>
                    </execution>
                    <!-- Fix 2: OneOf discriminator model missing constructors/properties for named audit subtypes.
                         The generator creates constructors for numbered anonymous types (AuditLogDetailsOneOf1-8)
                         but the deserializer tries to instantiate using named types (CopyAudit, MoveAudit, etc.) -->
                    <execution>
                        <id>fix-csharp-oneof-audit-constructors</id>
                        <phase>process-sources</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <property name="oneOfFile" value="${project.build.directory}/generated-sdk/csharp/src/OpenFilz.Sdk/Model/AuditLogDetailsOneOf.cs" />
                                <!-- 1. Add named audit subtype constructors before OnCreated().
                                     The generated JsonConverter calls new AuditLogDetailsOneOf(namedAudit, sourceFileId),
                                     so constructors MUST include the Option<Guid?> sourceFileId parameter.
                                     NOTE: We do NOT assign SourceFileIdOption because that property may not exist
                                     on all generator versions (CS0103 on CI). The sourceFileId is accepted but ignored. -->
                                <replaceregexp file="${oneOfFile}" encoding="UTF-8" match="(partial void OnCreated\(\);)" replace="// Constructors for named audit subtypes (OpenAPI Generator bug fix)${line.separator} public AuditLogDetailsOneOf(CopyAudit copyAudit, Option&lt;Guid?&gt; sourceFileId = default) { CopyAudit = copyAudit; OnCreated(); }${line.separator} public AuditLogDetailsOneOf(CreateFolderAudit createFolderAudit, Option&lt;Guid?&gt; sourceFileId = default) { CreateFolderAudit = createFolderAudit; OnCreated(); }${line.separator} public AuditLogDetailsOneOf(DeleteAudit deleteAudit, Option&lt;Guid?&gt; sourceFileId = default) { DeleteAudit = deleteAudit; OnCreated(); }${line.separator} public AuditLogDetailsOneOf(DeleteMetadataAudit deleteMetadataAudit, Option&lt;Guid?&gt; sourceFileId = default) { DeleteMetadataAudit = deleteMetadataAudit; OnCreated(); }${line.separator} public AuditLogDetailsOneOf(MoveAudit moveAudit, Option&lt;Guid?&gt; sourceFileId = default) { MoveAudit = moveAudit; OnCreated(); }${line.separator} public AuditLogDetailsOneOf(RenameAudit renameAudit, Option&lt;Guid?&gt; sourceFileId = default) { RenameAudit = renameAudit; OnCreated(); }${line.separator} public AuditLogDetailsOneOf(ReplaceAudit replaceAudit, Option&lt;Guid?&gt; sourceFileId = default) { ReplaceAudit = replaceAudit; OnCreated(); }${line.separator} public AuditLogDetailsOneOf(UpdateMetadataAudit updateMetadataAudit, Option&lt;Guid?&gt; sourceFileId = default) { UpdateMetadataAudit = updateMetadataAudit; OnCreated(); }${line.separator} public AuditLogDetailsOneOf(UploadAudit uploadAudit, Option&lt;Guid?&gt; sourceFileId = default) { UploadAudit = uploadAudit; OnCreated(); }${line.separator}${line.separator} \1" flags="m" />
                                <!-- 2. Add named audit subtype properties after the last numbered property (AuditLogDetailsOneOf8) -->
                                <replaceregexp file="${oneOfFile}" encoding="UTF-8" match="(public AuditLogDetailsOneOf8\? AuditLogDetailsOneOf8 \{ get; set; \})" replace="\1${line.separator}${line.separator} // Properties for named audit subtypes (OpenAPI Generator bug fix)${line.separator} public CopyAudit? CopyAudit { get; set; }${line.separator} public CreateFolderAudit? CreateFolderAudit { get; set; }${line.separator} public DeleteAudit? DeleteAudit { get; set; }${line.separator} public DeleteMetadataAudit? DeleteMetadataAudit { get; set; }${line.separator} public MoveAudit? MoveAudit { get; set; }${line.separator} public RenameAudit? RenameAudit { get; set; }${line.separator} public ReplaceAudit? ReplaceAudit { get; set; }${line.separator} public UpdateMetadataAudit? UpdateMetadataAudit { get; set; }${line.separator} public UploadAudit? UploadAudit { get; set; }" flags="m" />
                            </target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>publishSdk</id>
            <properties>
                <maven.deploy.skip>true</maven.deploy.skip>
            </properties>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>exec-maven-plugin</artifactId>
                        <version>${exec-maven-plugin.version}</version>
                        <executions>
                            <execution>
                                <id>dotnet-pack</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>exec</goal>
                                </goals>
                                <configuration>
                                    <executable>dotnet</executable>
                                    <workingDirectory>${project.build.directory}/generated-sdk/csharp</workingDirectory>
                                    <arguments>
                                        <argument>pack</argument>
                                        <argument>-c</argument>
                                        <argument>Release</argument>
                                    </arguments>
                                </configuration>
                            </execution>
                            <execution>
                                <id>nuget-push</id>
                                <phase>deploy</phase>
                                <goals>
                                    <goal>exec</goal>
                                </goals>
                                <configuration>
                                    <executable>dotnet</executable>
                                    <workingDirectory>${project.build.directory}/generated-sdk/csharp</workingDirectory>
                                    <arguments>
                                        <argument>nuget</argument>
                                        <argument>push</argument>
                                        <argument>**/*.nupkg</argument>
                                        <argument>--api-key</argument>
                                        <argument>${env.NUGET_API_KEY}</argument>
                                        <argument>--source</argument>
                                        <argument>https://api.nuget.org/v3/index.json</argument>
                                    </arguments>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

</project>
