<?= $this->extend("v2/layout/main_layout"); ?>

<?= $this->section("content") ?>
<div x-data="disciplines()" x-init="init()">
  
  <!-- Page Header -->
  <div class="card-glass p-6 animate-fadeIn mb-6">
    <div class="flex items-center gap-4">
      <div class="w-14 h-14 rounded-2xl bg-gradient-to-br from-indigo-600 to-indigo-900 flex items-center justify-center shadow-lg">
        <i class="fa-solid fa-layer-group text-2xl text-white"></i>
      </div>
      <div>
        <h2 class="text-2xl font-bold" style="color: rgb(var(--color-text));">Lab Disciplines</h2>
        <p class="text-sm" style="color: rgb(var(--color-text-muted));">Manage laboratory disciplines and specialties</p>
      </div>
    </div>
  </div>

  <!-- Search & Actions Bar -->
  <div class="card mb-6">
    <div class="p-4">
      <div class="flex flex-col sm:flex-row gap-4 items-center justify-between">
        <div class="flex w-full sm:w-auto gap-2">
          <input 
            type="text" 
            placeholder="Search disciplines..." 
            class="input flex-1 sm:w-80"
            x-model="keyword"
            @keyup.enter="fetchList()"
          />
          <button class="btn btn-primary" @click="fetchList()">
            <i class="fa-solid fa-search"></i>
          </button>
        </div>
        <button class="btn btn-primary w-full sm:w-auto" @click="showForm()">
          <i class="fa-solid fa-plus mr-2"></i>
          Add Discipline
        </button>
      </div>
    </div>
  </div>

  <!-- Content Card -->
  <div class="card overflow-hidden">
    <!-- Loading State -->
    <div x-show="loading" class="p-12 text-center" x-cloak>
      <div class="spinner spinner-lg mx-auto mb-4"></div>
      <p style="color: rgb(var(--color-text-muted));">Loading disciplines...</p>
    </div>

    <!-- Table -->
    <div class="overflow-x-auto" x-show="!loading">
      <table class="table table-compact w-full">
        <thead>
          <tr>
            <th width="80">ID</th>
            <th>Discipline Name</th>
            <th>Code</th>
            <th class="text-center">Actions</th>
          </tr>
        </thead>
        <tbody>
          <!-- Empty State -->
          <template x-if="!list || list.length === 0">
            <tr>
              <td colspan="4" class="text-center py-4">
                <div class="flex flex-col items-center gap-2 py-2" style="color: rgb(var(--color-text-muted));">
                  <i class="fa-solid fa-inbox text-3xl opacity-40"></i>
                  <p class="text-sm">No disciplines found</p>
                  <button class="btn btn-primary btn-xs mt-1" @click="showForm()">
                    <i class="fa-solid fa-plus mr-1"></i> Add First Discipline
                  </button>
                </div>
              </td>
            </tr>
          </template>

          <!-- Discipline Rows -->
          <template x-for="item in flatListWithLevels" :key="item.DisciplineID">
            <tr :class="item.level === 0 ? 'bg-slate-50/50' : 'hover:bg-opacity-50'">
              <td :class="item.level === 1 ? 'pl-8' : ''">
                <span class="badge badge-ghost font-mono text-xs" :class="{'opacity-60': item.level === 1}" x-text="item.DisciplineID"></span>
              </td>
              <td :class="item.level === 1 ? 'pl-12' : ''">
                <div class="flex items-center gap-2" :class="item.level === 0 ? 'font-bold' : ''" style="color: rgb(var(--color-text));">
                  <i :class="item.level === 0 ? 'fa-solid fa-folder-open text-amber-500' : 'fa-solid fa-chevron-right text-xs opacity-30'"></i>
                  <span x-text="item.DisciplineName"></span>
                </div>
              </td>
              <td class="font-mono text-sm" :class="{'opacity-70': item.level === 1}" x-text="item.DisciplineCode"></td>
              <td class="text-center">
                <div class="flex items-center justify-center gap-1">
                  <button class="btn btn-ghost btn-sm btn-square" @click="editDiscipline(item.DisciplineID)" title="Edit">
                    <i class="fa-solid fa-pen text-sky-500"></i>
                  </button>
                  <button class="btn btn-ghost btn-sm btn-square" @click="confirmDelete(item)" title="Delete">
                    <i class="fa-solid fa-trash" style="color: rgb(var(--color-error));"></i>
                  </button>
                </div>
              </td>
            </tr>
          </template>
        </tbody>
      </table>
    </div>
  </div>

  <!-- Include Form Dialog -->
  <?= $this->include('v2/master/organization/discipline_dialog') ?>

  <!-- Delete Confirmation Modal -->
  <div 
    x-show="showDeleteModal" 
    x-cloak
    class="modal-overlay"
    @click.self="showDeleteModal = false"
  >
    <div class="modal-content p-6 max-w-md">
      <h3 class="font-bold text-lg mb-4 flex items-center gap-2" style="color: rgb(var(--color-error));">
        <i class="fa-solid fa-exclamation-triangle"></i>
        Confirm Delete
      </h3>
      <p class="mb-6" style="color: rgb(var(--color-text));">
        Are you sure you want to delete discipline <strong x-text="deleteTarget?.DisciplineName"></strong>?
        This action cannot be undone.
      </p>
      <div class="flex gap-2">
        <button class="btn btn-ghost flex-1" @click="showDeleteModal = false">Cancel</button>
        <button class="btn flex-1" style="background: rgb(var(--color-error)); color: white;" @click="deleteDiscipline()" :disabled="deleting">
          <span x-show="deleting" class="spinner spinner-sm"></span>
          <span x-show="!deleting">Delete</span>
        </button>
      </div>
    </div>
  </div>

</div>
<?= $this->endSection() ?>

<?= $this->section("script") ?>
<script>
function disciplines() {
  return {
    // State
    loading: false,
    list: [],
    flatList: [],
    sitesList: [],
    keyword: "",

    // Get flattened list with level indicators for table rendering
    get flatListWithLevels() {
      const flat = [];
      this.list.forEach(parent => {
        flat.push({ ...parent, level: 0 });
        if (parent.children && parent.children.length > 0) {
          parent.children.forEach(child => {
            flat.push({ ...child, level: 1, ParentID: parent.DisciplineID });
          });
        }
      });
      return flat;
    },

    // Form Modal
    showModal: false,
    isEditing: false,
    saving: false,
    errors: {},
    form: {
      DisciplineID: null,
      DisciplineCode: "",
      DisciplineName: "",
      SiteID: "",
      Parent: ""
    },

    // Delete Modal
    showDeleteModal: false,
    deleteTarget: null,
    deleting: false,

    // Lifecycle
    async init() {
      await this.fetchList();
      await this.fetchSites();
    },

    // Fetch discipline list
    async fetchList() {
      this.loading = true;
      try {
        const params = new URLSearchParams();
        if (this.keyword) params.append('DisciplineName', this.keyword);
        
        const res = await fetch(`${BASEURL}api/organization/discipline?${params}`, {
          credentials: 'include'
        });
        if (!res.ok) throw new Error("HTTP error");
        const data = await res.json();
        
        this.list = data.data || [];
        
        // Build flat list for parent selection dropdown
        const flat = [];
        this.list.forEach(p => {
          flat.push({ DisciplineID: p.DisciplineID, DisciplineName: p.DisciplineName });
          if (p.children && p.children.length > 0) {
            p.children.forEach(c => {
              flat.push({ DisciplineID: c.DisciplineID, DisciplineName: `— ${c.DisciplineName}` });
            });
          }
        });
        this.flatList = flat;

      } catch (err) {
        console.error(err);
        this.list = [];
      } finally {
        this.loading = false;
      }
    },

    // Fetch site list for dropdown
    async fetchSites() {
      try {
        const res = await fetch(`${BASEURL}api/organization/site`, {
          credentials: 'include'
        });
        const data = await res.json();
        this.sitesList = data.data || [];
      } catch (err) {
        console.error('Failed to fetch sites:', err);
      }
    },

    // Show form for new discipline
    showForm() {
      this.isEditing = false;
      this.form = {
        DisciplineID: null,
        DisciplineCode: "",
        DisciplineName: "",
        SiteID: "",
        Parent: ""
      };
      this.errors = {};
      this.showModal = true;
    },

    // Edit discipline
    async editDiscipline(id) {
      this.isEditing = true;
      this.errors = {};
      try {
        const res = await fetch(`${BASEURL}api/organization/discipline/${id}`, {
          credentials: 'include'
        });
        const data = await res.json();
        if (data.data) {
          this.form = { ...this.form, ...data.data };
          this.showModal = true;
        }
      } catch (err) {
        console.error(err);
        alert('Failed to load discipline data');
      }
    },

    // Validate form
    validate() {
      const e = {};
      if (!this.form.DisciplineName?.trim()) e.DisciplineName = "Discipline name is required";
      if (!this.form.DisciplineCode?.trim()) e.DisciplineCode = "Discipline code is required";
      this.errors = e;
      return Object.keys(e).length === 0;
    },

    // Close modal
    closeModal() {
      this.showModal = false;
      this.errors = {};
    },

    // Save discipline
    async save() {
      if (!this.validate()) return;
      
      this.saving = true;
      try {
        const method = this.isEditing ? 'PATCH' : 'POST';
        const res = await fetch(`${BASEURL}api/organization/discipline`, {
          method: method,
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify(this.form),
          credentials: 'include'
        });
        
        const data = await res.json();
        
        if (res.ok) {
          this.closeModal();
          await this.fetchList();
        } else {
          alert(data.message || "Failed to save");
        }
      } catch (err) {
        console.error(err);
        alert("Failed to save discipline");
      } finally {
        this.saving = false;
      }
    },

    // Confirm delete
    confirmDelete(discipline) {
      this.deleteTarget = discipline;
      this.showDeleteModal = true;
    },

    // Delete discipline
    async deleteDiscipline() {
      if (!this.deleteTarget) return;
      
      this.deleting = true;
      try {
        const res = await fetch(`${BASEURL}api/organization/discipline`, {
          method: 'DELETE',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ DisciplineID: this.deleteTarget.DisciplineID }),
          credentials: 'include'
        });
        
        if (res.ok) {
          this.showDeleteModal = false;
          await this.fetchList();
        } else {
          alert("Failed to delete");
        }
      } catch (err) {
        console.error(err);
        alert("Failed to delete discipline");
      } finally {
        this.deleting = false;
        this.deleteTarget = null;
      }
    }
  }
}
</script>
<?= $this->endSection() ?>

