import apiClient from "@/infrastructure/apiClient";
import apiPath from "@/infrastructure/apiPath";

export default {
  /**
   * Tìm kiếm ngân hàng với phân trang
   */
  async search(searchModel) {
    const params = JSON.parse(JSON.stringify(searchModel));
    var result = await apiClient
      .post(apiPath.bank.search, params)
      .then((r) => {
        return r.data;
      })
      .catch((e) => {
        console.log(e);
        return {};
      });
    return result;
  },

  /**
   * Lấy tất cả ngân hàng đang hoạt động
   */
  async getAll() {
    var result = await apiClient
      .get(apiPath.bank.getAll)
      .then((r) => {
        return r.data;
      })
      .catch((e) => {
        console.log(e);
        return {};
      });
    return result;
  },

  /**
   * Lấy chi tiết ngân hàng theo ID
   */
  async getById(id) {
    var result = await apiClient
      .get(apiPath.bank.getById + id)
      .then((r) => {
        return r.data;
      })
      .catch((e) => {
        console.log(e);
        return {};
      });
    return result;
  },

  /**
   * Tạo ngân hàng mới
   */
  async create(bankModel) {
    const params = JSON.parse(JSON.stringify(bankModel));
    var result = await apiClient
      .post(apiPath.bank.create, params)
      .then((r) => {
        return r.data;
      })
      .catch((e) => {
        console.log(e);
        return {};
      });
    return result;
  },

  /**
   * Cập nhật ngân hàng
   */
  async update(bankModel) {
    const params = JSON.parse(JSON.stringify(bankModel));
    var result = await apiClient
      .put(apiPath.bank.update, params)
      .then((r) => {
        return r.data;
      })
      .catch((e) => {
        console.log(e);
        return {};
      });
    return result;
  },

  //#region createOrUpdate
  /**
   * Tạo hoặc cập nhật ngân hàng dựa vào Id
   */
  async createOrUpdate(bankModel) {
    if (bankModel && bankModel.Id > 0) {
      return await this.update(bankModel);
    }
    return await this.create(bankModel);
  },
  //#endregion

  /**
   * Xóa ngân hàng (soft delete)
   */
  async delete(id) {
    var result = await apiClient
      .delete(apiPath.bank.delete + id)
      .then((r) => {
        return r.data;
      })
      .catch((e) => {
        console.log(e);
        return {};
      });
    return result;
  },

  /**
   * Khởi tạo dữ liệu mẫu ngân hàng
   */
  async initializeBankData() {
    var result = await apiClient
      .post(apiPath.bank.initializeBankData)
      .then((r) => {
        return r.data;
      })
      .catch((e) => {
        console.log(e);
        return {};
      });
    return result;
  },

  /**
   * Tìm kiếm ngân hàng theo từ khóa
   */
  async sugBank(keyword) {
    var result = await apiClient
      .get(apiPath.bank.sugBank, {
        params: { keyword: keyword },
      })
      .then((r) => {
        return r.data;
      })
      .catch((e) => {
        console.log(e);
        return [];
      });
    return result;
  },

  /**
   * Validate dữ liệu ngân hàng trước khi gửi
   */
  validateBank(bankModel) {
    const errors = [];

    // Validate mã ngân hàng
    if (!bankModel.BankCode) {
      errors.push({ Key: "BankCode", Message: "Mã ngân hàng là bắt buộc" });
    } else if (!/^\d{6}$/.test(bankModel.BankCode.toString())) {
      errors.push({
        Key: "BankCode",
        Message: "Mã ngân hàng phải là 6 chữ số",
      });
    }

    // Validate tên đầy đủ
    if (!bankModel.FullName || bankModel.FullName.trim().length === 0) {
      errors.push({ Key: "FullName", Message: "Tên đầy đủ là bắt buộc" });
    } else if (
      bankModel.FullName.length < 5 ||
      bankModel.FullName.length > 200
    ) {
      errors.push({ Key: "FullName", Message: "Tên đầy đủ từ 5-200 ký tự" });
    }

    // Validate tên thương hiệu
    if (!bankModel.BrandName || bankModel.BrandName.trim().length === 0) {
      errors.push({ Key: "BrandName", Message: "Tên thương hiệu là bắt buộc" });
    } else if (
      bankModel.BrandName.length < 2 ||
      bankModel.BrandName.length > 50
    ) {
      errors.push({
        Key: "BrandName",
        Message: "Tên thương hiệu từ 2-50 ký tự",
      });
    }

    // Validate mã SWIFT (nếu có)
    if (bankModel.SwiftCode && bankModel.SwiftCode.trim().length > 0) {
      if (
        !/^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$/.test(
          bankModel.SwiftCode.toUpperCase()
        )
      ) {
        errors.push({
          Key: "SwiftCode",
          Message: "Mã SWIFT không đúng định dạng (8-11 ký tự)",
        });
      }
    }

    // Validate website (nếu có)
    if (bankModel.Website && bankModel.Website.trim().length > 0) {
      if (!/^https?:\/\/.+/.test(bankModel.Website)) {
        errors.push({
          Key: "Website",
          Message: "Website phải bắt đầu bằng http:// hoặc https://",
        });
      }
    }

    // Validate vốn điều lệ
    if (bankModel.CharterCapital && bankModel.CharterCapital < 0) {
      errors.push({ Key: "CharterCapital", Message: "Vốn điều lệ phải >= 0" });
    }

    // Validate loại ngân hàng
    if (!bankModel.BankType || ![1, 2, 3, 4, 5].includes(bankModel.BankType)) {
      errors.push({ Key: "BankType", Message: "Loại ngân hàng không hợp lệ" });
    }

    return {
      IsValid: errors.length === 0,
      Errors: errors,
    };
  },

  /**
   * Chuẩn bị dữ liệu ngân hàng trước khi gửi API
   */
  prepareBankModel(bankModel) {
    const prepared = { ...bankModel };

    // Chuẩn hóa mã SWIFT
    if (prepared.SwiftCode) {
      prepared.SwiftCode = prepared.SwiftCode.toUpperCase().trim();
    }

    // Chuẩn hóa website
    if (prepared.Website && !prepared.Website.startsWith("http")) {
      prepared.Website = "https://" + prepared.Website;
    }

    // Đảm bảo các trường số
    if (prepared.BankCode) {
      prepared.BankCode = parseInt(prepared.BankCode);
    }
    if (prepared.CharterCapital) {
      prepared.CharterCapital = parseFloat(prepared.CharterCapital);
    }
    if (prepared.BankType) {
      prepared.BankType = parseInt(prepared.BankType);
    }

    // Chuẩn hóa ngày thành lập
    if (
      prepared.EstablishedDate &&
      typeof prepared.EstablishedDate === "string"
    ) {
      prepared.EstablishedDate = new Date(
        prepared.EstablishedDate
      ).toISOString();
    }

    return prepared;
  },
};
