/*
JavaNCSS
methodMaximum = 7
classMaximum = 3
fileMaximum = 2
recordMaximum = 4


*/

//non-compiled with javac: Compilable with Java14
package com.puppycrawl.tools.checkstyle.checks.metrics.javancss;  // violation 'NCSS for this file is 89 (max allowed is 2).'

import java.time.LocalDateTime;

public class InputJavaNCSSRecordsAndCompactCtors {  // violation '.* is 87 (max allowed is 3).'

  class TestClass {  // violation 'NCSS for this class is 7 (max allowed is 3).'
    //should count as 2
    private void testMethod1() {

      //should count as 1
      int x = 1, y = 2;
    }

    //should count as 4
    private void testMethod2() {

      int abc = 0;

      //should count as 2
      testLabel: abc = 1;
    } // 7
  }

  record MyRecord1(boolean t, boolean f) {  // violation '.* is 6 (max allowed is 4).'
    public MyRecord1 {
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
    } // 6
  }

  record MyRecord2(boolean a, boolean b) {  // violation '.* is 15 (max allowed is 4).'
    MyRecord2() {
      this(true, false);
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");

    } // 6

    //should give an ncss of 8 , violation for method
    private void testMethod() { // violation 'NCSS for this method is 8 (max allowed is 7).'

      for (int i=0; i<10; i++) {

        if (i==0) {

            //should count as 1
            int x = 1, y = 2;
        }
        else {
            int abc = 0;

            //should count as 2
            testLabel: abc = 1;
        }
      }
    }
  } // 15

  record MyRecord3(boolean a, boolean b) {  // violation '.* is 6 (max allowed is 4).'
    public void foo () {
      //should give an ncss of 2
      record TestInnerRecord() {

        private static Object test;
      }
      System.out.println("test");
      System.out.println("test");
    }
  } // 6

  record MyRecord4(int x, int y) { // ok
    //should give an ncss of 2
    record TestInnerRecord() {
      private static Object test;
    }
  }

  record MyRecord5(int x, int y) { // ok
    //should give an ncss of 4
    public MyRecord5{
      if(x > 5) {
        System.out.println("x greater than 5!");
      }
    }
  }

  record MyRecord6(int x, int y) { // ok
    //should give an ncss of 2
    public MyRecord6{
    }
  }

  public record FXOrder(int units,  // violation 'NCSS for this record is 8 (max allowed is 4).'
                        String side,
                        double price,
                        LocalDateTime sentAt,
                        int ttl) {
    public FXOrder {
      if (units < 1) {
        throw new IllegalArgumentException(
                "FXOrder units must be positive");
      }
      if (ttl < 0) {
        throw new IllegalArgumentException(
                "FXOrder TTL must be positive, or 0 for market orders");
      }
      if (price <= 0.0) {
        throw new IllegalArgumentException(
                "FXOrder price must be positive");
      }
    } // 8
  }

  public class FXOrderClass {  // violation 'NCSS for this class is 11 (max allowed is 3).'
    private int units;
    private int ttl;
    private double price; // 3

    public FXOrderClass(int units, int ttl, double price) {
      if (units < 1) {
        throw new IllegalArgumentException(
                "FXOrder units must be positive");
      }
      if (ttl < 0) {
        throw new IllegalArgumentException(
                "FXOrder TTL must be positive, or 0 for market orders");
      }
      if (price <= 0.0) {
        throw new IllegalArgumentException(
                "FXOrder price must be positive");
      }
    } // 8
  }

  record MyRecord7(int x, int y) {  // violation 'NCSS for this record is 12 (max allowed is 4).'
    public MyRecord7{ // violation 'NCSS for this method is 11 (max allowed is 7).'
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
    }
  }

  class MyClass {  // violation 'NCSS for this class is 12 (max allowed is 3).'
    MyClass(int x) {  // violation 'NCSS for this method is 11 (max allowed is 7).'
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
      System.out.println("test");
    }
  }

}

