describe("Roles and Permissions Management", () => {
  beforeEach(() => {
    cy.login();
  });

  describe("Roles Management", () => {
    beforeEach(() => {
      cy.visit("/roles");
      cy.waitForLoading();
    });

    it("should display roles list page", () => {
      cy.contains("مدیریت نقش‌ها").should("be.visible");
      cy.contains("مدیریت نقش‌ها و دسترسی‌های سیستم").should("be.visible");
      cy.get('[title="نقش جدید"]').should("be.visible");
    });

    it("should create a new role", () => {
      cy.get('[title="نقش جدید"]').click();

      cy.url().should("include", "/roles/create");
      cy.contains("نقش جدید").should("be.visible");

      // Fill role form
      cy.get('input[name="name"]').type("مدیر محصولات");
      cy.get('textarea[name="description"]').type(
        "مسئول مدیریت محصولات و کاتگوری‌ها"
      );

      cy.get('button[type="submit"]').click();

      cy.url().should("include", "/roles");
      cy.contains("نقش با موفقیت ایجاد شد").should("be.visible");
      cy.contains("مدیر محصولات").should("be.visible");
    });

    it("should edit a role", () => {
      cy.get('[title="ویرایش"]').first().click();

      cy.url().should("include", "/roles/");
      cy.url().should("include", "/edit");

      cy.get('input[name="name"]').clear().type("مدیر فروش");
      cy.get('textarea[name="description"]')
        .clear()
        .type("مسئول مدیریت فروش و سفارشات");

      cy.get('button[type="submit"]').click();

      cy.url().should("include", "/roles");
      cy.contains("نقش با موفقیت ویرایش شد").should("be.visible");
      cy.contains("مدیر فروش").should("be.visible");
    });

    it("should delete a role", () => {
      cy.get('[title="حذف"]').first().click();

      cy.get(".modal").should("be.visible");
      cy.get("button").contains("حذف").click();

      cy.contains("نقش با موفقیت حذف شد").should("be.visible");
    });

    it("should view role details", () => {
      cy.get('[title="مشاهده جزئیات"]').first().click();

      cy.url().should("include", "/roles/");
      cy.contains("جزئیات نقش").should("be.visible");
      cy.contains("لیست کاربران").should("be.visible");
      cy.contains("دسترسی‌ها").should("be.visible");
    });

    it("should manage role permissions", () => {
      cy.get('[title="مدیریت دسترسی‌ها"]').first().click();

      cy.url().should("include", "/roles/");
      cy.url().should("include", "/permissions");

      cy.contains("مدیریت دسترسی‌های نقش").should("be.visible");

      // Assign permission
      cy.get('input[type="checkbox"]').first().check();
      cy.get("button").contains("ذخیره تغییرات").click();

      cy.contains("دسترسی‌ها با موفقیت به‌روزرسانی شد").should("be.visible");
    });

    it("should search roles", () => {
      cy.get('input[placeholder*="جستجو"]').type("مدیر");
      cy.get("button").contains("جستجو").click();

      cy.waitForLoading();
      cy.get("table tbody tr").should("contain", "مدیر");
    });

    it("should validate role form", () => {
      cy.get('[title="نقش جدید"]').click();

      cy.get('button[type="submit"]').click();

      cy.contains("نام نقش الزامی است").should("be.visible");
    });
  });

  describe("Permissions Management", () => {
    beforeEach(() => {
      cy.visit("/permissions");
      cy.waitForLoading();
    });

    it("should display permissions list page", () => {
      cy.contains("لیست دسترسی‌ها").should("be.visible");
      cy.contains("نمایش دسترسی‌های سیستم").should("be.visible");
      cy.get('[title="دسترسی جدید"]').should("be.visible");
    });

    it("should create a new permission", () => {
      cy.get('[title="دسترسی جدید"]').click();

      cy.url().should("include", "/permissions/create");
      cy.contains("دسترسی جدید").should("be.visible");

      // Fill permission form
      cy.get('input[name="title"]').type("مدیریت کاربران");
      cy.get('textarea[name="description"]').type(
        "دسترسی به مدیریت کاربران سیستم"
      );
      cy.get('input[name="resource"]').type("users");
      cy.get('input[name="action"]').type("manage");

      cy.get('button[type="submit"]').click();

      cy.url().should("include", "/permissions");
      cy.contains("دسترسی با موفقیت ایجاد شد").should("be.visible");
      cy.contains("مدیریت کاربران").should("be.visible");
    });

    it("should edit a permission", () => {
      cy.get('[title="ویرایش"]').first().click();

      cy.url().should("include", "/permissions/");
      cy.url().should("include", "/edit");

      cy.get('input[name="title"]').clear().type("نمایش کاربران");
      cy.get('input[name="action"]').clear().type("view");

      cy.get('button[type="submit"]').click();

      cy.url().should("include", "/permissions");
      cy.contains("دسترسی با موفقیت ویرایش شد").should("be.visible");
      cy.contains("نمایش کاربران").should("be.visible");
    });

    it("should delete a permission", () => {
      cy.get('[title="حذف"]').first().click();

      cy.get(".modal").should("be.visible");
      cy.get("button").contains("حذف").click();

      cy.contains("دسترسی با موفقیت حذف شد").should("be.visible");
    });

    it("should search permissions", () => {
      cy.get('input[placeholder*="جستجو"]').type("کاربر");
      cy.get("button").contains("جستجو").click();

      cy.waitForLoading();
      cy.get("table tbody tr").should("contain", "کاربر");
    });

    it("should filter permissions by resource", () => {
      cy.get('select[name="resource"]').select("products");
      cy.get("button").contains("اعمال فیلتر").click();

      cy.waitForLoading();
      cy.get("table tbody tr").should("contain", "products");
    });

    it("should validate permission form", () => {
      cy.get('[title="دسترسی جدید"]').click();

      cy.get('button[type="submit"]').click();

      cy.contains("عنوان دسترسی الزامی است").should("be.visible");
      cy.contains("منبع الزامی است").should("be.visible");
      cy.contains("عمل الزامی است").should("be.visible");
    });

    it("should show permission usage in roles", () => {
      cy.get('[title="نمایش استفاده"]').first().click();

      cy.get(".modal").should("be.visible");
      cy.contains("نقش‌های دارای این دسترسی").should("be.visible");
    });
  });

  describe("Role-Permission Assignment", () => {
    it("should assign multiple permissions to role", () => {
      cy.visit("/roles");
      cy.get('[title="مدیریت دسترسی‌ها"]').first().click();

      // Select multiple permissions
      cy.get('input[type="checkbox"]').check(["1", "2", "3"]);
      cy.get("button").contains("ذخیره تغییرات").click();

      cy.contains("دسترسی‌ها با موفقیت به‌روزرسانی شد").should("be.visible");
    });

    it("should remove permission from role", () => {
      cy.visit("/roles");
      cy.get('[title="مدیریت دسترسی‌ها"]').first().click();

      // Uncheck permission
      cy.get('input[type="checkbox"]:checked').first().uncheck();
      cy.get("button").contains("ذخیره تغییرات").click();

      cy.contains("دسترسی‌ها با موفقیت به‌روزرسانی شد").should("be.visible");
    });

    it("should show permission hierarchy", () => {
      cy.visit("/roles");
      cy.get('[title="مدیریت دسترسی‌ها"]').first().click();

      // Should show permissions grouped by category
      cy.contains("کاربران").should("be.visible");
      cy.contains("محصولات").should("be.visible");
      cy.contains("سیستم").should("be.visible");
    });
  });
});
