import { TransactionStateService } from './../../services/state/transaction-state.service';
import { ITrnmst, IDropBdg } from './../../interfaces/main.interface';
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { FormBuilder, FormGroup, Validators, FormControl } from '@angular/forms';
import { GeneralService } from '../../services/generalservice';
import { DashboardStateService } from '../../services/state/dashboard-state.service';
import { Router } from '@angular/router';
import { ActivatedRoute } from '@angular/router';
import { Location } from '@angular/common';
import { ToastrService } from 'ngx-toastr';

@Component({
  selector: 'app-budget-aproval',
  standalone: false,
  templateUrl: './budget-aproval.html',
  styleUrl: './budget-aproval.css',
})
export class BudgetAproval implements OnInit {
  @Output() ExpenseEventSubmit = new EventEmitter<any>();
  @Input() prjnam!: string;
  @Input() prjseq!: string;

  budgetForm!: FormGroup;
  isFormExpanded = true;
  isEditMode = false;
  editingIndex: number = -1;
  showConfirmModal = false;
  myTrnMst: ITrnmst[]=[];
  myDropBdg: IDropBdg[]=[];
  param:string = '';
  // State สำหรับการลบ
  showDeleteModal = false;
  deleteIndex: number = -1;

  // budgetCategoriesDrop = [
  //   { dtlcod: 'EXP01', dtlnam: 'ค่าวัสดุอุปกรณ์ (EXP01)' },
  //   { dtlcod: 'EXP02', dtlnam: 'ค่าจ้างเหมาแรงงาน (EXP02)' },
  //   { dtlcod: 'EXP03', dtlnam: 'ค่าครุภัณฑ์ (EXP03)' }
  // ];

  // budgetItems: IBudgetItem[] = [];

  constructor(
    private location: Location,
    private toastr: ToastrService,
    private route: ActivatedRoute,
    private transactionStateService: TransactionStateService
  ) {}

  ngOnInit(): void {
    this.param = this.route.snapshot.paramMap.get('seq') ?? '';
    this.setupFormControl();
    this.transactionStateService.getTransactionState().subscribe(data => {
      this.myTrnMst = data || []
    });
    this.transactionStateService.getBudgetDrop().subscribe(data => {
      this.myDropBdg = data ?? []
    });
  }

  setupFormControl() {
    this.budgetForm = new FormGroup({
      bdgcod: new FormControl('', [Validators.required]),
      amount: new FormControl('', [Validators.required, Validators.min(1)])
    });
  }

  toggleFormCollapse() {
    this.isFormExpanded = !this.isFormExpanded;
  }

  // onSaveSubmit() {
  //   if (this.budgetForm.invalid) {
  //     this.budgetForm.markAllAsTouched();
  //     return;
  //   }

  //   const formValue = this.budgetForm.value;
  //   const selectedCode = formValue.bdgcod;

  //   // Validation: เช็คว่าหมวดงบซ้ำหรือไม่
  //   const duplicateIndex = this.myTrnMst.findIndex(idx => idx.trnbdgcod === selectedCode);

  //   if (duplicateIndex !== -1) {
  //     // กรณีเพิ่มใหม่ (เจอซ้ำ = ห้าม) หรือ กรณีแก้ไข (เจอซ้ำกับแถวอื่นที่ไม่ใช่ตัวเอง = ห้าม)
  //     if (!this.isEditMode || (this.isEditMode && duplicateIndex !== this.editingIndex)) {
  //       this.toastr.error(`หมวดงบประมาณนี้ มีอยู่ในตารางแล้ว`, 'ไม่สามารถเพิ่มซ้ำได้', {
  //           positionClass: 'toast-top-right',
  //           timeOut: 3500,
  //           progressBar: true,
  //           progressAnimation: 'decreasing',
  //           toastClass:
  //           'ngx-toastr error-toast bg-white bg-opacity-90 text-red-700 shadow-lg'
  //         })
  //       return;
  //     }
  //   }

  //   const category = this.myDropBdg.find(c => c.bdgcod === selectedCode);

  //   const newItem: ITrnmst = {
  //     trnbdgcod: formValue.bdgcod,
  //     trnbdgnam: category ? category.bdgcod : formValue.bdgcod,
  //     trnexpbdg: Number(formValue.amount)
  //   };

  //   if (this.isEditMode && this.editingIndex > -1) {
  //     this.myTrnMst[this.editingIndex] = newItem;
  //     this.cancelEdit();
  //   } else {
  //     this.myTrnMst.push(newItem);
  //     this.budgetForm.reset();
  //     this.budgetForm.get('bdgcod')?.setValue('');
  //   }
  // }

  onSaveSubmit() {
    if (this.budgetForm.invalid) {
      this.budgetForm.markAllAsTouched();
      return;
    }

    const formValue = this.budgetForm.value;
    const selectedCode = formValue.bdgcod;

    // 1. Validation: เช็คว่าหมวดงบซ้ำหรือไม่
    const duplicateIndex = this.myTrnMst.findIndex(idx => idx.trnbdgcod === selectedCode);

    if (duplicateIndex !== -1) {
      // ถ้าไม่ใช่โหมดแก้ไข หรือ แก้ไขแต่ไปซ้ำกับคนอื่น
      if (!this.isEditMode || (this.isEditMode && duplicateIndex !== this.editingIndex)) {
        this.toastr.error(`หมวดงบประมาณนี้ (${selectedCode}) มีอยู่ในตารางแล้ว`, 'ไม่สามารถเพิ่มซ้ำได้', {
            timeOut: 3500,
            progressBar: true
        });
        return;
      }
    }

    // ✅ 2. ค้นหาชื่อหมวดงบ (Name) จาก Dropdown โดยใช้ Code ที่เลือก
    const category = this.myDropBdg.find(c => c.bdgcod === selectedCode);

    // ✅ 3. สร้าง Object ใหม่ โดยใส่ชื่อ (trnbdgnam) ที่ค้นหาได้ลงไป
    const newItem: ITrnmst = {
      trnbdgcod: selectedCode,
      // ถ้าเจอชื่อให้ใส่ชื่อ ถ้าไม่เจอให้ใส่รหัสแทน (กันเหนียว)
      trnbdgnam: category ? category.bdgnam : selectedCode,
      trnexpbdg: Number(formValue.amount),
      trnprjnam: this.projectTitle // คงชื่อโครงการเดิมไว้
    };

    if (this.isEditMode && this.editingIndex > -1) {
      // กรณีแก้ไข: Merge ข้อมูลใหม่ทับของเดิม (เพื่อรักษา field อื่นๆ เช่น trnseq ไว้ถ้ามี)
      this.myTrnMst[this.editingIndex] = {
        ...this.myTrnMst[this.editingIndex],
        ...newItem
      };
      this.cancelEdit();
    } else {
      // กรณีเพิ่มใหม่
      this.myTrnMst.push(newItem);
      this.budgetForm.reset();
      this.budgetForm.get('bdgcod')?.setValue('');
    }
  }

  editItem(index: number) {
    const item = this.myTrnMst[index];
    this.isEditMode = true;
    this.editingIndex = index;
    this.isFormExpanded = true;
    this.budgetForm.patchValue({
      bdgcod: item.trnbdgcod,
      amount: item.trnexpbdg
    });
  }

  cancelEdit() {
    this.isEditMode = false;
    this.editingIndex = -1;
    this.budgetForm.reset();
    this.budgetForm.get('bdgcod')?.setValue('');
  }

  removeItem(index: number) {
    // // if(confirm('ต้องการลบรายการนี้หรือไม่?')) {
    // this.myTrnMst.splice(index, 1);
    // if (this.isEditMode && this.editingIndex === index) {
    //   this.cancelEdit();
    // }
    // // }

    this.deleteIndex = index;
    this.showDeleteModal = true;
  }

  confirmDelete() {
    if (this.deleteIndex > -1) {
      this.myTrnMst.splice(this.deleteIndex, 1);

      // ถ้าลบตัวที่กำลังแก้อยู่ ให้เคลียร์ฟอร์ม
      if (this.isEditMode && this.editingIndex === this.deleteIndex) {
        this.cancelEdit();
      }

      this.toastr.success('ลบรายการเรียบร้อย', 'สำเร็จ');
    }
    this.closeDeleteModal();
  }

  closeDeleteModal() {
    this.showDeleteModal = false;
    this.deleteIndex = -1;
  }

  getTotalAmount() {
    return this.myTrnMst.reduce((sum, item) => sum + Number(item.trnexpbdg || 0), 0);
  }


  openConfirmModal() {
    this.showConfirmModal = true;
  }

  closeConfirmModal() {
    this.showConfirmModal = false;
  }

  confirmSave() {
    const expenseList = this.myTrnMst.map(item => ({
      bdgcod: item.trnbdgcod,
      amount: Number(item.trnexpbdg)
    }));


    const body = {
      prjseq: this.prjseq,
      expenseList: expenseList
    };

    this.expenseEventSubmit(body);
  }

  expenseEventSubmit(event: any){
    this.ExpenseEventSubmit.emit(event);
  }

  goBack() {
    this.location.back();
  }

  get projectTitle(): string {
    return this.myTrnMst?.[0]?.trnprjnam ?? '';
  }
}
