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

<?= $this->section("content") ?>
<div x-data="workstations()" 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-purple-600 to-purple-900 flex items-center justify-center shadow-lg">
        <i class="fa-solid fa-desktop text-2xl text-white"></i>
      </div>
      <div>
        <h2 class="text-2xl font-bold" style="color: rgb(var(--color-text));">Organization Workstations</h2>
        <p class="text-sm" style="color: rgb(var(--color-text-muted));">Manage lab workstations and equipment units</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 workstations..." 
            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 Workstation
        </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 workstations...</p>
    </div>

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

          <!-- Workstation Rows -->
          <template x-for="ws in list" :key="ws.WorkstationID">
            <tr class="hover:bg-opacity-50">
              <td>
                <span class="badge badge-ghost font-mono text-xs" x-text="ws.WorkstationID || '-'"></span>
              </td>
              <td>
                <div class="font-medium" style="color: rgb(var(--color-text));" x-text="ws.WorkstationName || '-'"></div>
              </td>
              <td class="font-mono text-sm" x-text="ws.WorkstationCode || '-'"></td>
              <td x-text="ws.DepartmentName || '-'"></td>
              <td>
                <span class="badge badge-sm" :class="ws.Enable == 1 ? 'badge-success' : 'badge-ghost'" x-text="ws.Enable == 1 ? 'Active' : 'Disabled'"></span>
              </td>
              <td class="text-center">
                <div class="flex items-center justify-center gap-1">
                  <button class="btn btn-ghost btn-sm btn-square" @click="editWorkstation(ws.WorkstationID)" title="Edit">
                    <i class="fa-solid fa-pen text-sky-500"></i>
                  </button>
                  <button class="btn btn-ghost btn-sm btn-square" @click="confirmDelete(ws)" 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/workstation_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 workstation <strong x-text="deleteTarget?.WorkstationName"></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="deleteWorkstation()" :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 workstations() {
  return {
    // State
    loading: false,
    list: [],
    departmentsList: [],
    keyword: "",

    // Form Modal
    showModal: false,
    isEditing: false,
    saving: false,
    errors: {},
    form: {
      WorkstationID: null,
      WorkstationCode: "",
      WorkstationName: "",
      DepartmentID: "",
      Type: "",
      Enable: 1,
      LinkTo: ""
    },

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

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

    // Fetch workstation list
    async fetchList() {
      this.loading = true;
      try {
        const params = new URLSearchParams();
        if (this.keyword) params.append('WorkstationName', this.keyword);
        
        const res = await fetch(`${BASEURL}api/organization/workstation?${params}`, {
          credentials: 'include'
        });
        if (!res.ok) throw new Error("HTTP error");
        const data = await res.json();
        
        this.list = data.data || [];
      } catch (err) {
        console.error(err);
        this.list = [];
      } finally {
        this.loading = false;
      }
    },

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

    // Show form for new workstation
    showForm() {
      this.isEditing = false;
      this.form = {
        WorkstationID: null,
        WorkstationCode: "",
        WorkstationName: "",
        DepartmentID: "",
        Type: "",
        Enable: 1,
        LinkTo: ""
      };
      this.errors = {};
      this.showModal = true;
    },

    // Edit workstation
    async editWorkstation(id) {
      this.isEditing = true;
      this.errors = {};
      try {
        const res = await fetch(`${BASEURL}api/organization/workstation/${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 workstation data');
      }
    },

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

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

    // Save workstation
    async save() {
      if (!this.validate()) return;
      
      this.saving = true;
      try {
        const method = this.isEditing ? 'PATCH' : 'POST';
        const res = await fetch(`${BASEURL}api/organization/workstation`, {
          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 workstation");
      } finally {
        this.saving = false;
      }
    },

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

    // Delete workstation
    async deleteWorkstation() {
      if (!this.deleteTarget) return;
      
      this.deleting = true;
      try {
        const res = await fetch(`${BASEURL}api/organization/workstation`, {
          method: 'DELETE',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ WorkstationID: this.deleteTarget.WorkstationID }),
          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 workstation");
      } finally {
        this.deleting = false;
        this.deleteTarget = null;
      }
    }
  }
}
</script>
<?= $this->endSection() ?>
