 
import plugin from 'tailwindcss/plugin';

export default plugin(({config, addBase, addComponents, addVariant, e}) => {  
  // Menu
  addComponents({
    '.menu': {
      'display': 'flex',
    },
    '.menu-item, .menu-link': {
      'padding': '0',
      'margin': '0',
    },
    '.menu-item': {
      'display': 'flex',
      'flex-direction': 'column'
    },
    '.menu-link, .menu-label, .menu-toggle': {
      'cursor': 'pointer',
      'display': 'flex',
      'align-items': 'center',
      'flex-grow': '1',
    },
    '.menu-title': {
      'display': 'flex',
      'align-items': 'center',
      'line-height': '1',
      'flex-grow': '1',
    },
    '.menu-icon, .menu-bullet, .menu-badge, .menu-arrow': {
      'display': 'flex',
      'align-items': 'center',
      'flex-shrink': '0',
    },
    '.menu-dropdown, .menu-accordion': {
      'padding': '0',
      'margin': '0',
      'display': 'none',
      'align-items': 'stretch',
      'flex-direction': 'column'
    },
    '.menu-dropdown': {
      '.show.menu-item-dropdown > &, .base-Popper-root > .menu-container > &, &.menu.show, &.show[data-popper-placement]': {
        'display': 'flex',
        'will-change': 'transform'
      }
    },
    '.menu-accordion': {
      'display': 'none',
      'transition': 'height .3s ease',
      '.show:not(.menu-dropdown) > &, .transitioning:not(.menu-dropdown) > &, &.show': {
        'display': 'flex',
      }
    }
  });

  addVariant('menu-item-active', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.active.${e(`menu-item-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.active > .menu-link.${e(`menu-item-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.active > .menu-link .${e(`menu-item-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.active > .menu-label.${e(`menu-item-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.active > .menu-label .${e(`menu-item-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.active > .menu-toggle.${e(`menu-item-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.active > .menu-toggle .${e(`menu-item-active${separator}${className}`)}`;
      });
    }
  ]);

  addVariant('menu-item-here', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.here.${e(`menu-item-here${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.here > .menu-link.${e(`menu-item-here${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.here > .menu-link .${e(`menu-item-here${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.here > .menu-label.${e(`menu-item-here${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.here > .menu-label .${e(`menu-item-here${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.here > .menu-toggle.${e(`menu-item-here${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.here > .menu-toggle .${e(`menu-item-here${separator}${className}`)}`;
      });
    }
  ]);

  addVariant('menu-item-show', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.show.${e(`menu-item-show${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.show > .menu-link.${e(`menu-item-show${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.show > .menu-link .${e(`menu-item-show${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.show > .menu-label.${e(`menu-item-show${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.show > .menu-label .${e(`menu-item-show${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.show > .menu-toggle.${e(`menu-item-show${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.show > .menu-toggle .${e(`menu-item-show${separator}${className}`)}`;
      });
    }
  ]);

  addVariant('menu-item-disabled', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.disabled.${e(`menu-item-disabled${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.disabled > .menu-link.${e(`menu-item-disabled${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.disabled > .menu-link .${e(`menu-item-disabled${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.disabled > .menu-label.${e(`menu-item-disabled${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.disabled > .menu-label .${e(`menu-item-disabled${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.disabled > .menu-toggle.${e(`menu-item-disabled${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item.disabled > .menu-toggle .${e(`menu-item-disabled${separator}${className}`)}`;
      });
    }
  ]);

  addVariant('menu-link-hover', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-link:hover.${e(`menu-link-hover${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-link:hover .${e(`menu-link-hover${separator}${className}`)}`;
      });
    }
  ]);

  addVariant('menu-link-focus', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-link:focus.${e(`menu-link-focus${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-link:focus .${e(`menu-link-focus${separator}${className}`)}`;
      });
    },
  ]); 
  
  // DataTable
  addVariant('datatable-loading', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-datatable].loading.${e(`datatable-loading${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-datatable].loading .${e(`datatable-loading${separator}${className}`)}`;
      });
    }
  ]);

  addVariant('datatable-initialized', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-datatable].initialized.${e(`datatable-initialized${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-datatable].initialized .${e(`datatable-initialized${separator}${className}`)}`;
      });
    }
  ]);

  addVariant('datatable-sort', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-datatable] .sort.asc.desc.${e(`datatable-sort${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-datatable] .sort.asc.desc .${e(`datatable-sort${separator}${className}`)}`;
      });
    }
  ]);

  addVariant('datatable-sort-asc', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-datatable] .sort.asc.${e(`datatable-sort-asc${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-datatable] .sort.asc .${e(`datatable-sort-asc${separator}${className}`)}`;
      });
    }
  ]);

  addVariant('datatable-sort-desc', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-datatable] .sort.desc.${e(`datatable-sort-desc${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-datatable] .sort.desc .${e(`datatable-sort-desc${separator}${className}`)}`;
      });
    }
  ]);

  // Accordion
  addVariant('accordion-active', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-accordion-item].active.${e(
            `accordion-active${separator}${className}`,
        )}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-accordion-item].active > [data-accordion-toggle] .${e(
            `accordion-active${separator}${className}`,
        )}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-accordion-item].active > [data-accordion-toggle].${e(
            `accordion-active${separator}${className}`,
        )}`;
      });
    },
  ]);

  // Modal
	addVariant('modal-open', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-modal].open.${e(`modal-open${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-modal].open .${e(`modal-open${separator}${className}`)}`;
      });
    },
  ]);

  // Drawer
  addVariant('drawer-open', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-drawer].open.${e(`drawer-open${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-drawer].open .${e(`drawer-open${separator}${className}`)}`;
      });
    }
  ]);

  // Dropdown
  addVariant('dropdown-open', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-dropdown].open .${e(`dropdown-open${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-dropdown-content].open .${e(`dropdown-open${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item-dropdown.show .${e(`dropdown-open${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.menu-item-dropdown.show.${e(`dropdown-open${separator}${className}`)}`;
      });
    }
  ]);

  // Toggle
  addVariant('toggle-active', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-toggle].active.${e(`toggle-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-toggle].active .${e(`toggle-active${separator}${className}`)}`;
      });
    }
  ]);

  // Sticky
  addVariant('sticky-active', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-sticky].active .${e(`sticky-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-sticky].active .${e(`sticky-active${separator}${className}`)}`;
      });
    }
  ]);
  
  // Collapse
  addVariant('collapse-active', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-collapse].active .${e(`collapse-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-collapse].active.${e(`collapse-active${separator}${className}`)}`;
      });
    }
  ]);

  // Dismiss
  addVariant('dismiss', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-dismiss].${e(`dismiss${separator}${className}`)}`;
      });
    }
  ]);

  // Tabs
  addVariant('tab-active', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-tab-toggle].active.${e(`tab-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-tab-toggle].active .${e(`tab-active${separator}${className}`)}`;
      });
    },
  ]);

  // Button
  addVariant('btn-active', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.btn.active.${e(`btn-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `.btn.active .${e(`btn-active${separator}${className}`)}`;
      });
    },
  ]);

  // Toggle Password
  addVariant('toggle-password-active', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-toggle-password].active.${e(`toggle-password-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-toggle-password].active .${e(`toggle-password-active${separator}${className}`)}`;
      });
    },
  ]);

  // Scrollspy
  addVariant('scrollspy-active', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-scrollspy-anchor].active.${e(`scrollspy-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-scrollspy-anchor].active .${e(`scrollspy-active${separator}${className}`)}`;
      });
    },
  ]);

  // Image Input
	addVariant('image-input-empty', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-image-input].empty .${e(`image-input-empty${separator}${className}`)}`;
      });
    },
  ]);

	addVariant('image-input-changed', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-image-input].changed .${e(`image-input-changed${separator}${className}`)}`;
      });
    },
  ]);

  // Stepper
  addVariant('stepper-first', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-stepper].first .${e(`stepper-first${separator}${className}`)}`;
      });
    },
  ]);
  
  addVariant('stepper-between', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-stepper].between .${e(`stepper-between${separator}${className}`)}`;
      });
    },
  ]);

  addVariant('stepper-last', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-stepper].last .${e(`stepper-last${separator}${className}`)}`;
      });
    },
  ]);

  addVariant('stepper-item-active', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-stepper-item].active.${e(`stepper-item-active${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-stepper-item].active .${e(`stepper-item-active${separator}${className}`)}`;
      });
    },
  ]);

  addVariant('stepper-item-completed', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-stepper-item].completed.${e(`stepper-item-completed${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-stepper-item].completed .${e(`stepper-item-completed${separator}${className}`)}`;
      });
    },
  ]);

  addVariant('stepper-item-pending', [
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-stepper-item].pending.${e(`stepper-item-pending${separator}${className}`)}`;
      });
    },
    ({modifySelectors, separator}) => {
      modifySelectors(({className}) => {
        return `[data-stepper-item].pending .${e(`stepper-item-pending${separator}${className}`)}`;
      });
    },
  ]);

  // Theme
	addVariant('light-mode', ({ modifySelectors, separator }) => {
		modifySelectors(({ className }) => {
			return `[data-theme-mode=light] .${e(`light-mode${separator}${className}`)}`;
		});
	});

	addVariant('dark-mode', ({ modifySelectors, separator }) => {
		modifySelectors(({ className }) => {
			return `[data-theme-mode=dark] .${e(`dark-mode${separator}${className}`)}`;
		});
	});

	addVariant('system-mode', ({ modifySelectors, separator }) => {
		modifySelectors(({ className }) => {
			return `[data-theme-mode=system] .${e(`system-mode${separator}${className}`)}`;
		});
	});

  addVariant('light', ({ modifySelectors, separator }) => {
		modifySelectors(({ className }) => {
			return `.light .${e(`light${separator}${className}`)}`;
		});
	});

  // Breakpoints
  const breakpoints = {};
  const screens = config().theme.screens;

  for (const screen of Object.keys(screens)) {
    const pixels = screens[screen];
    breakpoints[`--tw-${screen}`] = pixels;
  }

  addBase({
    ':root': breakpoints
  });
});