/// <reference types="../support" />

describe("Discount Codes Management - Fixed", () => {
  beforeEach(() => {
    cy.login();
    cy.visit("/discount-codes");
    cy.waitForLoading();
  });

  it("should display discount codes list page", () => {
    cy.contains("مدیریت کدهای تخفیف").should("be.visible");
    cy.getByTestId("create-discount-button").should("be.visible");
  });

  it("should navigate to create discount code page", () => {
    cy.getByTestId("create-discount-button").click();
    cy.url().should("include", "/discount-codes/create");
    cy.contains("ایجاد کد تخفیف").should("be.visible");
  });

  it("should create a basic percentage discount code", () => {
    cy.getByTestId("create-discount-button").click();

    // Fill basic information using data-testid
    cy.getByTestId("discount-code-input").type("SAVE20");
    cy.getByTestId("discount-name-input").type("تخفیف ۲۰ درصدی");
    cy.getByTestId("discount-description-textarea").type(
      "تخفیف ۲۰ درصدی برای کل خرید"
    );

    // Set discount settings using data-testid
    cy.getByTestId("discount-type-select").select("percentage");
    cy.getByTestId("discount-value-input").type("20");

    // Set other required fields
    cy.getByTestId("discount-status-select").select("active");
    cy.getByTestId("discount-application-level-select").select("invoice");

    // Submit form
    cy.getByTestId("submit-discount-button").click();

    // Verify creation (might need to mock API response)
    cy.url().should("include", "/discount-codes");
  });

  it("should validate required fields properly", () => {
    cy.getByTestId("create-discount-button").click();

    // Submit button should be disabled initially
    cy.getByTestId("submit-discount-button").should("be.disabled");

    // Fill only code field
    cy.getByTestId("discount-code-input").type("TEST");
    cy.getByTestId("submit-discount-button").should("be.disabled");

    // Fill name field
    cy.getByTestId("discount-name-input").type("Test Name");
    cy.getByTestId("submit-discount-button").should("be.disabled");

    // Fill all required fields
    cy.getByTestId("discount-type-select").select("percentage");
    cy.getByTestId("discount-value-input").type("10");
    cy.getByTestId("discount-status-select").select("active");
    cy.getByTestId("discount-application-level-select").select("invoice");

    // Now submit button should be enabled
    cy.getByTestId("submit-discount-button").should("not.be.disabled");
  });

  it("should validate code length constraints", () => {
    cy.getByTestId("create-discount-button").click();

    // Test code too short
    cy.getByTestId("discount-code-input").type("AB");
    cy.getByTestId("discount-name-input").type("Test");
    cy.getByTestId("discount-type-select").select("percentage");
    cy.getByTestId("discount-value-input").type("10");

    // Check for validation error
    cy.get(".text-red-600").should("contain", "کد باید حداقل ۳ کاراکتر باشد");

    // Clear and test code too long
    cy.getByTestId("discount-code-input").clear().type("A".repeat(51));
    cy.get(".text-red-600").should(
      "contain",
      "کد نباید بیشتر از ۵۰ کاراکتر باشد"
    );
  });

  it("should create different discount types", () => {
    const discountTypes = [
      { type: "percentage", value: "25", level: "invoice" },
      { type: "fixed", value: "50000", level: "invoice" },
      { type: "fee_percentage", value: "5", level: "product_fee" },
    ];

    discountTypes.forEach((discount, index) => {
      // Navigate to create page before each iteration
      cy.visit("/discount-codes");
      cy.waitForLoading();
      cy.getByTestId("create-discount-button").click();

      cy.getByTestId("discount-code-input").type(
        `TEST${index}${discount.type.toUpperCase()}`
      );
      cy.getByTestId("discount-name-input").type(`Test ${discount.type}`);
      cy.getByTestId("discount-type-select").select(discount.type);
      cy.getByTestId("discount-value-input").type(discount.value);
      cy.getByTestId("discount-status-select").select("active");
      cy.getByTestId("discount-application-level-select").select(
        discount.level
      );

      cy.getByTestId("submit-discount-button").click();
      cy.url().should("include", "/discount-codes");
    });
  });

  it("should handle form cancellation", () => {
    cy.getByTestId("create-discount-button").click();

    // Fill some data
    cy.getByTestId("discount-code-input").type("CANCELTEST");
    cy.getByTestId("discount-name-input").type("Cancel Test");

    // Click cancel button
    cy.getByTestId("cancel-discount-button").click();

    // Should return to list page
    cy.url().should("include", "/discount-codes");
    cy.url().should("not.include", "/create");
  });

  it("should show empty state when no results found", () => {
    // Search for non-existent code
    cy.get('input[placeholder*="جستجو"]').type("NONEXISTENTCODE123");
    cy.wait(500);

    // Check for empty state
    cy.contains("هیچ کد تخفیفی یافت نشد").should("be.visible");
  });

  it("should navigate back properly", () => {
    cy.getByTestId("create-discount-button").click();

    // Wait for form to load completely
    cy.getByTestId("discount-code-input").should("be.visible");

    // Click cancel button
    cy.getByTestId("cancel-discount-button").click();

    // Should return to list page
    cy.url().should("include", "/discount-codes");
    cy.url().should("not.include", "/create");
  });

  // Test with API mocking
  it("should handle API errors gracefully", () => {
    // Mock API error
    cy.intercept("POST", "**/discount/**", {
      statusCode: 400,
      body: { message: "کد تخفیف تکراری است" },
    }).as("createError");

    cy.getByTestId("create-discount-button").click();

    cy.getByTestId("discount-code-input").type("ERRORTEST");
    cy.getByTestId("discount-name-input").type("Error Test");
    cy.getByTestId("discount-type-select").select("percentage");
    cy.getByTestId("discount-value-input").type("10");
    cy.getByTestId("discount-status-select").select("active");
    cy.getByTestId("discount-application-level-select").select("invoice");

    cy.getByTestId("submit-discount-button").click();

    cy.wait("@createError");
    // Error message should appear
    cy.contains("خطا در ایجاد کد تخفیف").should("be.visible");
  });

  it("should handle loading states", () => {
    // Mock slow API response
    cy.intercept("POST", "**/discount/**", {
      delay: 2000,
      statusCode: 201,
      body: { id: 1, code: "TEST", name: "Test" },
    }).as("createSlow");

    cy.getByTestId("create-discount-button").click();

    cy.getByTestId("discount-code-input").type("LOADTEST");
    cy.getByTestId("discount-name-input").type("Load Test");
    cy.getByTestId("discount-type-select").select("percentage");
    cy.getByTestId("discount-value-input").type("10");
    cy.getByTestId("discount-status-select").select("active");
    cy.getByTestId("discount-application-level-select").select("invoice");

    cy.getByTestId("submit-discount-button").click();

    // Check loading state
    cy.getByTestId("submit-discount-button").should("be.disabled");

    cy.wait("@createSlow");
  });

  // Test mobile responsiveness
  it("should work on mobile viewport", () => {
    cy.viewport("iphone-6");

    cy.getByTestId("create-discount-button").should("be.visible");
    cy.getByTestId("create-discount-button").click();

    cy.contains("ایجاد کد تخفیف").should("be.visible");

    // Form should be usable on mobile
    cy.getByTestId("discount-code-input").type("MOBILETEST");
    cy.getByTestId("discount-name-input").type("Mobile Test");
    cy.getByTestId("discount-type-select").select("percentage");
    cy.getByTestId("discount-value-input").type("10");
    cy.getByTestId("discount-status-select").select("active");
    cy.getByTestId("discount-application-level-select").select("invoice");

    // Scroll to submit button to make it visible
    cy.getByTestId("submit-discount-button").scrollIntoView();
    cy.getByTestId("submit-discount-button").should("be.visible");
  });

  // Test accessibility
  it("should be accessible", () => {
    cy.getByTestId("create-discount-button").click();

    // Check for proper labels
    cy.get("label").should("have.length.greaterThan", 5);

    // Check for required field indicators
    cy.getByTestId("discount-code-input").should(
      "have.attr",
      "aria-required",
      "true"
    );
    cy.getByTestId("discount-name-input").should(
      "have.attr",
      "aria-required",
      "true"
    );

    // Check for proper form structure
    cy.get("form").should("exist");
    cy.get(".bg-gradient-to-r").should("have.length.greaterThan", 3);
  });
});
